22

我读过一些外国代码,我想检查一下我的假设:

@synchronized(self)self用于在设置属性时去掉前缀。

所以在下面的示例中,我设置的strText是实例,而不仅仅是一个局部变量,对吧?

- (void)myfunction{
    NSString * strText = @"var in function";
    @synchronized(self)
    {
         strText = @"var class (self.strText)";
    }

}
4

3 回答 3

41

请阅读本文档

@synchronized()指令锁定一段代码供单个线程使用。其他线程被阻塞,直到线程退出受保护的代码——也就是说,当执行继续超过@synchronized()块中的最后一条语句时。

@synchronized()指令将任何 Objective-C 对象作为其唯一参数,包括self.

正如Massimo Cafaro 所指出的:“在应用程序变为多线程之前创建所有互斥对象是最安全的,以避免竞争条件。”

于 2011-01-11T05:26:39.833 回答
8

@synchronized(self) 用于摆脱自我。字首。

因此,在我的示例中,我将 strText 设置在我在类中设置的函数中。

两个概念被混为一谈。

  1. @synchronized(self) { ... }self仅使用对象作为信号量锁定块。
  2. 在 Objective-C 中,没有什么像with在其他语言中那样的假设性陈述消除了对self.whatever公正的需求whatever。可能想参加斯坦福 CS193P 在线课程来复习这门语言。
于 2012-07-30T09:03:03.557 回答
0

在多线程环境中,如果多个线程尝试访问相同的内存地址可能会导致“竞争条件”,为了避免这种情况,您应该使用“互斥锁(互斥)”,除了阻塞或限制或锁定 n 个线程在同一时间点访问相同的内存地址或内容,并且在一个实例中只允许一个线程。这可以通过使用 @synchronized 指令在 Objective C 中实现。

示例:通常在实现单例设计模式或类时,您会在任何 iOS 项目中看到如下所示的某种代码片段,

+(id)getSingletonInstance
{
    @synchronized(self)
    {
        if (singletonObj == nil)
        {
            singletonObj = [[self alloc] init];
        }
        return singletonObj;
    }
}
于 2019-01-29T06:39:45.280 回答