有人能详细地向我解释什么时候我必须使用每个属性:nonatomic, copy, strong, weak,等等,对于一个声明的属性,并解释每个属性的作用吗?举个例子也很好。我使用的是ARC。
nonatomic
copy
strong
weak
这个链接已经失效了
< 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所有权。
Assign意味着__unsafe_unretained所有权。
copy暗示__strong ownership,以及copy的通常行为 在setter上的语义
Retain表示强烈的所有权。
Strong意味着__strong所有权。
Unsafe_unretained意味着__unsafe_unretained所有权。
Weak意味着__weak所有权。
nonatomic属性意味着@synthesized方法是否不会生成threadsafe——但这比atomic属性快得多,因为消除了额外的检查。
@synthesize
atomic
strong与ARC一起使用,它基本上帮助你,不用担心对象的保留计数。当您使用完它时,ARC会自动为您释放它。使用关键字strong意味着你拥有对象。
weak所有权意味着你不拥有它,它只是跟踪对象,直到分配给它的对象保持不变,一旦第二个对象被释放,它就失去了它的值。如。obj.a=objectB;被使用并且a具有weak属性,因此它的值只有在objectB仍然在内存中时才有效。
obj.a=objectB;
copy属性很好地这里介绍的
strong,weak,retain,copy,assign是互斥的,所以你不能在一个对象上使用它们…阅读“申报财产”;部分
strong,weak,retain,copy,assign
希望这对你有所帮助……
< >强Nonatomic < / >强将<强> < / >强不通过@synthesize访问器生成线程安全例程。atomic将生成线程安全的访问器,因此atomic变量是线程安全的(可以从多个线程访问而不会破坏数据)
Nonatomic
当对象是可变的时,copy是必需的。如果您需要对象当前的值,并且不希望该值反映该对象的其他所有者所做的任何更改,则使用此选项。当您完成对象时,您将需要释放它,因为您将保留副本。
Assign在某种程度上与copy相反。当调用assign属性的getter时,它返回一个对实际数据的引用。通常当你有一个基本类型的属性(float, int, BOOL…)
Assign
assign
当属性是指向分配在堆上的引用计数对象的指针时,retain是必需的。分配应该是这样的:
retain
NSObject* obj = [[NSObject alloc] init]; // ref counted var
由@synthesize生成的setter将在复制对象时向对象添加引用计数,因此如果原始副本超出范围,底层对象不会自动销毁。
当你完成对象时,你需要释放它。使用retain的__abc0将增加引用计数并占用自动释放池中的内存。
strong是retain属性的替换,作为Objective-C自动引用计数(ARC)的一部分。在非arc代码中,它只是保留的同义词。
弱
weak类似于strong,除了它不会将引用计数增加1。它不会成为该对象的所有者,而只是保存对该对象的引用。如果对象的引用计数下降到0,即使您可能仍然在这里指向它,它将从内存中释放。
上面的链接包含关于弱与强。的良好信息
@interface MyClass: NSObject @property (atomic, strong) NSDictionary *dict; ...
dict