Obj-C 2.0中属性的文档说原子属性在内部使用锁,但它没有记录锁的具体内容.有没有人知道这是一个per-property锁,一个每个对象的锁与@synchronized(self)使用的隐式锁分开,还是等同于@synchronized(self)?
查看生成的代码(适用于ARM的iOS SDK GCC 4.0/4.2),
直接访问32位assign
属性(包括struct {int32_t v;}
).
使用objc_copyStruct()访问大于32位的结构.
double
并且int64_t
使用objc_copyStruct进行访问,除了在GCC 4.0上,用stmia/ldmia直接访问它们(我不确定在中断的情况下是否保证这是原子的).
retain/copy访问器调用objc_getProperty和objc_setProperty.
Cocoa with Love:内存和线程安全的自定义属性方法提供了有关如何在运行时版本objc4-371.2中实现它们的一些细节; 显然,精确的实现可以在运行时间之间变化(例如,在某些平台上,您可以使用原子交换/ CAS在ivar本身上旋转而不是使用另一个锁).
原子@properties使用的锁是一个实现细节 - 对于适当平台上的适当类型,没有锁定的原子操作是可能的,如果Apple没有利用它们,我会感到惊讶.在任何情况下都没有公开访问锁,因此您不能在同一个锁上进行@synchronize.几位Apple工程师指出,原子特性并不能保证线程安全; 原子属性只保证该值的获取/设置是原子的.为了正确的线程安全,您必须使用更高级别的锁定或同步,并且您几乎肯定不希望使用与合成getter/setter可能使用的锁相同的锁.