在类函数中使用@synchronized(self){...}

时间:2012-03-22 13:54:54

标签: objective-c ios cocoa-touch cocoa

无意中,我一直在类方法中使用信号量@synchronized的{​​{1}}块。

self

它似乎是有效的代码,至少编译器没有给我任何不好的反馈。我的问题是:这里+(void)someFunction { @synchronized(self) { /* some code */ } } 是什么?据我所知,self块不起作用,但它也没有崩溃。

我只是好奇地问。

4 个答案:

答案 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块可以正常工作。