如何在Objective-C中使用属性?

时间:2011-03-02 18:58:11

标签: iphone objective-c object properties retain

我应该何时使用Objective-C中的nonatomicretainreadonlyreadwrite属性?

例如:

@property(nonatomic, retain) NSObject *myObject;

如果我使用nonatomicretain,这是否意味着该对象将被保留?

3 个答案:

答案 0 :(得分:10)

首先,我想将David Gelhar的评论推广到一个完整的答案。修饰符atomicnonatomic与线程安全无关。有关该空间的更多详细信息,请参阅this question

您列出的其他项目可以相对简单地解决。如果你想要更多,我会简短地点击它们并指向属性修饰符上的documentation

atomic vs nonatomic主要确保从合成的getter返回完整的值,并且完整的值由合成的setter写入。

readwrite vs readonly确定合成属性是否具有合成访问者(readwrite具有setter并且是默认值,readonly不是)。

assign vs retain vs copy确定合成访问者如何与Objective-C内存管理方案交互。 assign是默认值,只是执行变量赋值。 retain指定应在分配时发送新值-retain并发送旧值-releasecopy指定应在分配时发送-copy新值,并将旧值发送给-release

答案 1 :(得分:2)

如果您使用nonatomic,则读取和写入属性将不是线程安全的。在这一点上,我不认为这是你需要担心的事情,但非原子访问可能比原子访问更快,这就是为什么在这里使用它。

如果使用retain,写入属性将导致释放传出值并保留传入值,从而保持基于引用计数的正确值。

答案 2 :(得分:1)

nontomic 基本上,如果你说非原子,并且使用@synthesize生成访问器,那么如果多个线程尝试一次更改/读取属性,则可能发生错误。您可以获得部分写入的值或过度释放/保留的对象,这很容易导致崩溃。 (但这可能比原子访问器快得多。)

atomic 是默认行为。非原子是线程安全的。 readonly 外部财产将是只读的。

readwrite 属性将同时包含访问者和设置者。

assign(默认) - 指定setter使用简单赋值。 保留 - 指定在分配时应在对象上调用retain。此属性仅对Objective-C对象类型有效。 (您不能为Core Foundation对象指定retain)

copy - 指定应使用对象的副本进行分配。先前的值将发送一条释放消息。通过调用复制方法进行复制。此属性仅对对象类型有效,对象类型必须实现NSCopying协议。