我应该何时使用Objective-C中的nonatomic
,retain
,readonly
和readwrite
属性?
例如:
@property(nonatomic, retain) NSObject *myObject;
如果我使用nonatomic
和retain
,这是否意味着该对象将被保留?
答案 0 :(得分:10)
首先,我想将David Gelhar的评论推广到一个完整的答案。修饰符atomic
和nonatomic
与线程安全无关。有关该空间的更多详细信息,请参阅this question。
您列出的其他项目可以相对简单地解决。如果你想要更多,我会简短地点击它们并指向属性修饰符上的documentation。
atomic
vs nonatomic
主要确保从合成的getter返回完整的值,并且完整的值由合成的setter写入。
readwrite
vs readonly
确定合成属性是否具有合成访问者(readwrite
具有setter并且是默认值,readonly
不是)。
assign
vs retain
vs copy
确定合成访问者如何与Objective-C内存管理方案交互。 assign
是默认值,只是执行变量赋值。 retain
指定应在分配时发送新值-retain
并发送旧值-release
。 copy
指定应在分配时发送-copy
新值,并将旧值发送给-release
。
答案 1 :(得分:2)
如果您使用nonatomic
,则读取和写入属性将不是线程安全的。在这一点上,我不认为这是你需要担心的事情,但非原子访问可能比原子访问更快,这就是为什么在这里使用它。
如果使用retain
,写入属性将导致释放传出值并保留传入值,从而保持基于引用计数的正确值。
答案 2 :(得分:1)
nontomic 基本上,如果你说非原子,并且使用@synthesize生成访问器,那么如果多个线程尝试一次更改/读取属性,则可能发生错误。您可以获得部分写入的值或过度释放/保留的对象,这很容易导致崩溃。 (但这可能比原子访问器快得多。)
atomic 是默认行为。非原子是线程安全的。 readonly 外部财产将是只读的。
readwrite 属性将同时包含访问者和设置者。
assign(默认) - 指定setter使用简单赋值。 保留 - 指定在分配时应在对象上调用retain。此属性仅对Objective-C对象类型有效。 (您不能为Core Foundation对象指定retain)
copy - 指定应使用对象的副本进行分配。先前的值将发送一条释放消息。通过调用复制方法进行复制。此属性仅对对象类型有效,对象类型必须实现NSCopying协议。