Objective-C声明的@property属性(nonatomic, copy, strong, weak)

有人能详细地向我解释什么时候我必须使用每个属性:nonatomiccopystrongweak,等等,对于一个声明的属性,并解释每个属性的作用吗?举个例子也很好。我使用的是ARC。

162740 次浏览

这个链接已经失效了

< a href = " http://clang.llvm.org/docs/AutomaticReferenceCounting.html ownership.spelling.property " > http://clang.llvm.org/docs/AutomaticReferenceCounting.html ownership.spelling.property < / >

Assign意味着__unsafe_unretained所有权。

copy暗示__strong ownership,以及copy的通常行为 在setter上的语义

Retain表示强烈的所有权。

Strong意味着__strong所有权。

Unsafe_unretained意味着__unsafe_unretained所有权。

Weak意味着__weak所有权。

nonatomic属性意味着@synthesized方法是否不会生成threadsafe——但这比atomic属性快得多,因为消除了额外的检查。

strong与ARC一起使用,它基本上帮助你,不用担心对象的保留计数。当您使用完它时,ARC会自动为您释放它。使用关键字strong意味着你拥有对象。

weak所有权意味着你不拥有它,它只是跟踪对象,直到分配给它的对象保持不变,一旦第二个对象被释放,它就失去了它的值。如。obj.a=objectB;被使用并且a具有weak属性,因此它的值只有在objectB仍然在内存中时才有效。

copy属性很好地这里介绍的

strong,weak,retain,copy,assign是互斥的,所以你不能在一个对象上使用它们…阅读“申报财产”;部分

希望这对你有所帮助……

原子

< >强Nonatomic < / >强<强> < / >强不通过@synthesize访问器生成线程安全例程。atomic将生成线程安全的访问器,因此atomic变量是线程安全的(可以从多个线程访问而不会破坏数据)

复制

当对象是可变的时,copy是必需的。如果您需要对象当前的值,并且不希望该值反映该对象的其他所有者所做的任何更改,则使用此选项。当您完成对象时,您将需要释放它,因为您将保留副本。

分配

Assign在某种程度上与copy相反。当调用assign属性的getter时,它返回一个对实际数据的引用。通常当你有一个基本类型的属性(float, int, BOOL…)

保留

当属性是指向分配在堆上的引用计数对象的指针时,retain是必需的。分配应该是这样的:

NSObject* obj = [[NSObject alloc] init]; // ref counted var

@synthesize生成的setter将在复制对象时向对象添加引用计数,因此如果原始副本超出范围,底层对象不会自动销毁。

当你完成对象时,你需要释放它。使用retain的__abc0将增加引用计数并占用自动释放池中的内存。

强大的

strong是retain属性的替换,作为Objective-C自动引用计数(ARC)的一部分。在非arc代码中,它只是保留的同义词。

这是一个了解iOS 5的strongweak的好网站。 http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1 < / p >

weak类似于strong,除了它不会将引用计数增加1。它不会成为该对象的所有者,而只是保存对该对象的引用。如果对象的引用计数下降到0,即使您可能仍然在这里指向它,它将从内存中释放。

上面的链接包含关于弱与强。的良好信息

< p >很棒的答案! 我想更深入地澄清的一件事是nonatomic/atomic。 用户应该理解这个属性——“原子性”只在属性的引用上传播,而不是在它的内容上传播。 例如,atomic将保证读取/设置指针的用户原子性,并且只保证指向属性的指针。 例如:< / p >
@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
在这种情况下,保证dict的指针将由不同的线程以原子方式读取/设置。 但是dict本身(dict指向的字典)仍然是线程不安全,即对字典的所有读/添加操作仍然是线程不安全的 如果你需要线程安全收集,你要么有糟糕的架构(更常见),要么有实际需求(更罕见)。 如果它是“真正的需求”-你应该找到良好的测试线程安全集合组件或准备好考验和磨难编写自己的一个。 后一种情况着眼于“无锁”、“无等待”范式。乍一看像是火箭科学,但与“常规锁定”相比,它可以帮助你实现出色的性能