@synchronized(self)是否创建了一个块,其中属性上不需要自前缀?

时间:2011-01-11 05:23:00

标签: objective-c synchronized self declared-property

我已经阅读了一些外国代码中的内容,我想检查一下我的假设:

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

所以在下面的例子中,我正在设置实例的strText,而不仅仅是局部变量,对吗?

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

}

3 个答案:

答案 0 :(得分:41)

请阅读此Documentation

  

@synchronized()指令锁定一段代码以供a使用   单线程。其他线程被阻塞,直到线程退出   受保护的代码 - 即执行继续执行最后一次   @synchronized()块中的语句。

     

@synchronized()指令作为唯一参数any   Objective-C对象,包括self

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

答案 1 :(得分:8)

  

@synchronized(self)用于摆脱自我。前缀。

     

所以在我的例子中,我将strText设置为不在我设置的函数中   类。

正在混淆两个概念。

  1. @synchronized(self) { ... }仅使用self对象作为信号量锁定块。
  2. 在Objective-C中,没有像其他语言那样假设的with语句,因此self.whatever只需要whatever。可能想通过斯坦福CS193P在线课程来学习语言。

答案 2 :(得分:0)

  

在多线程环境中,如果有多个线程尝试访问   相同的内存地址可能会导致“种族状况”,以避免这种情况   您应该使用“互斥锁(互斥)”的条件   但阻止或限制或锁定n个要访问的线程   在同一时间点具有相同的内存地址或内容,并允许   在某个时间实例中只有一个线程。这可以通过以下方式实现   通过使用@synchronized指令来实现目标C。

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

+(id)getSingletonInstance
{
    @synchronized(self)
    {
        if (singletonObj == nil)
        {
            singletonObj = [[self alloc] init];
        }
        return singletonObj;
    }
}