当前位置:  开发笔记 > IOS > 正文

在Obj-C 2.0中锁定合成原子@properties的细节

如何解决《在Obj-C2.0中锁定合成原子@properties的细节》经验,为你挑选了2个好方法。

Obj-C 2.0中属性的文档说原子属性在内部使用锁,但它没有记录锁的具体内容.有没有人知道这是一个per-property锁,一个每个对象的锁与@synchronized(self)使用的隐式锁分开,还是等同于@synchronized(self)?



1> tc...:

查看生成的代码(适用于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本身上旋转而不是使用另一个锁).



2> Barry Wark..:

原子@properties使用的锁是一个实现细节 - 对于适当平台上的适当类型,没有锁定的原子操作是可能的,如果Apple没有利用它们,我会感到惊讶.在任何情况下都没有公开访问锁,因此您不能在同一个锁上进行@synchronize.几位Apple工程师指出,原子特性并不能保证线程安全; 原子属性只保证该值的获取/设置是原子的.为了正确的线程安全,您必须使用更高级别的锁定或同步,并且您几乎肯定不希望使用与合成getter/setter可能使用的锁相同的锁.

推荐阅读
mobiledu2402851173
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有