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

end*_*nda 21 objective-c synchronized self declared-property

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

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

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

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

}
Run Code Online (Sandbox Code Playgroud)

Tir*_*rth 41

请阅读本文档

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

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

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

  • 文档链接现已过时.请参考以下内容:https://developer.apple.com/library/ios/#documentation/Cocoa/Conceptual/Multithreading/ThreadSafety/ThreadSafety.html#//apple_ref/doc/uid/10000057i-CH8-SW1 (2认同)

new*_*cct 8

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

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

两个概念正在混淆.

  1. @synchronized(self) { ... }仅使用self对象作为信号量锁定块.
  2. 在Objective-C中,没有什么比with其他语言中的假设语句更能消除对self.whatever公正的需求whatever.可能想通过斯坦福CS193P在线课程来学习语言.

  • 为什么这个答案?它可以"回答"这个问题,但是 - 没有冒犯 - 你只是简单而无益. (7认同)
  • @synchronized对你是否需要"自我"没有影响.字首.他们无论如何都是无关紧要的. (5认同)
  • 这是三个实际解决@Matt问题误解的唯一答案.另外两个只是唠叨关于`@synchronized()`的文档 (2认同)