Obj-C 2.0的属性文档说原子属性在内部使用锁,但它没有记录锁的具体细节。有人知道这是每个属性一个锁,还是与@synchronized(self)使用的隐式锁分开的每个对象一个锁,或者相当于@synchronized(self)?
Obj-C 2.0的属性文档说原子属性在内部使用锁,但它没有记录锁的具体细节。有人知道这是每个属性一个锁,还是与@synchronized(self)使用的隐式锁分开的每个对象一个锁,或者相当于@synchronized(self)?
观察生成的代码(适用于iOS SDK GCC 4.0 / 4.2 for ARM):
assign
属性(包括struct {int32_t v;}
)直接访问。objc_copyStruct()
访问。double
和int64_t
通过objc_copyStruct()
访问,但在GCC 4.0上,它们使用stmia / ldmia直接访问(我不确定在中断的情况下是否保证原子性)。objc_getProperty()
和objc_setProperty()
。Cocoa with Love:内存和线程安全的自定义属性方法提供了一些有关它们在运行时版本objc4-371.2中如何实现的详细信息。显然,精确的实现可能因运行时而异(例如,在某些平台上,您可以使用原子交换/ CAS来旋转ivar本身而不是使用另一个锁)。