无意中,我一直在类方法中使用信号量@synchronized
的{{1}}块。
self
它似乎是有效的代码,至少编译器没有给我任何不好的反馈。我的问题是:这里+(void)someFunction {
@synchronized(self) {
/* some code */
}
}
是什么?据我所知,self
块不起作用,但它也没有崩溃。
我只是好奇地问。
答案 0 :(得分:13)
self
引用类,而不是实例。在ObjC中,类本身就是对象。
答案 1 :(得分:4)
self
是类本身,在类函数中使用@synchronized
是完全没问题的,因为它们也是Objective-C对象。
答案 2 :(得分:3)
@synchronized
语法是互斥实现的编译器扩展。我假设你理解what it does。编译器会将其转换为其他东西,据说类似于critical section,因为它的CPU密集度较低。需要跟踪锁。该实现将使用一个对象来记录锁的状态,以保持其完整性(即不应获取锁两次,或解锁两次)。
在@synchronized(self)
中,对象不一定是self
。它可以是任何客观的c对象。请注意,单个@synchronized
块通常不执行任何操作(当您提到它不起作用时,它实际上表现正常)。但是当你在同一个对象上有两个@synchronized
块时,只会同时执行一个块,另一个块必须等待锁被解锁(即第一块完成)。这有助于在多线程环境中保持同步。
答案 3 :(得分:0)
在类方法中self
是调用该方法的类。例如,您可以使用self
调用同一类的其他类方法。 [MyClass someFunction]
和[self someFunction]
等同于递归调用someFunction
。我确信@synchronized
块可以正常工作。