当我必须使用每个属性时,有人可以详细向我解释:nonatomic
,copy
,strong
,weak
等,对于声明的属性,并解释每个人的作用?某种例子也会很棒。我正在使用ARC。
答案 0 :(得分:555)
这个答案有很多错误,也已经过时了。请参阅其他问题/答案和评论。
<强>非原子强>
nonatomic
用于多线程目的。如果我们在声明时设置了非原子属性,那么任何其他想要访问该对象的线程都可以访问它并提供有关多线程的结果。
复制强>
当对象是可变的时, copy
是必需的。如果您此时需要对象的值,请使用此选项,并且您不希望该值反映对象的其他所有者所做的任何更改。完成后,您需要释放该对象,因为您要保留该副本。
指定强>
Assign
与copy
有些相反。调用assign
属性的getter时,它返回对实际数据的引用。通常,当您具有基本类型属性(float,int,BOOL ...)
<强>保留强>
当属性是指向对象的指针时, retain
是必需的。由@synthesize
生成的setter将保留(也称为保留计数)对象。完成后,您将需要释放该对象。通过使用retain,它将增加保留计数并占用自动释放池中的内存。
<强>强强>
strong
是retain属性的替代,是Objective-C自动引用计数(ARC)的一部分。在非ARC代码中,它只是retain的同义词。
这是一个了解iOS 5的strong
和weak
的好网站。
http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
<强>弱强>
weak
与strong
类似,只是它不会将引用计数增加1.它不会成为该对象的所有者,而只是拥有对它的引用。如果对象的引用计数降为0,即使您可能仍然在此处指向它,它也将从内存中释放。
以上链接包含有关弱和强
的良好信息答案 1 :(得分:45)
nonatomic
属性表明该对象不是线程安全的,这意味着如果一个不同的线程试图访问该对象而不是坏事可能发生,但这比原子属性要快得多。
strong
与ARC一起使用,它基本上可以帮助您,而不必担心对象的保留计数。完成后,ARC会自动为您释放它。使用关键字strong
意味着您拥有该对象。
weak
所有权意味着你不拥有它,它只是跟踪对象,直到它被分配的对象停留,一旦第二个对象被释放它就失去了价值。例如。使用obj.a=objectB;
并且a具有弱属性,其值只有在objectB保留在内存中才有效。
copy
属性非常好explained here
strong,weak,retain,copy,assign
是互斥的,因此您无法在一个对象上使用它们...阅读"Declared Properties "部分
希望这会帮助你...
答案 2 :(得分:17)
此链接有分解
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
assign暗示__unsafe_unretained所有权。
复制意味着__strong所有权,以及复制的通常行为 设定者的语义。
保留意味着__strong所有权。
强烈暗示__strong所有权。
unsafe_unretained意味着__unsafe_unretained所有权。
弱意味着__弱所有权。
答案 3 :(得分:9)
很棒的答案!
我想更深入澄清的一点是nonatomic
/ atomic
。
用户应该明白这个属性 - “原子性”只在属性的引用上传播,而不是在它的内容上传播。
即atomic
将保证用户读取/设置指针的原子性以及仅指向属性的指针。
例如:
@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
在这种情况下,可以保证不同线程以原子方式读取/设置指向dict
的指针。
但是dict
本身(字典dict
指向)仍然是线程不安全,即对字典的所有读取/添加操作仍然是线程不安全的。
如果您需要线程安全收集,您可能有糟糕的架构(更常见)或真正的要求(更罕见)。 如果它是“真正的要求” - 您应该找到良好和经过测试的线程安全收集组件,或者为编写自己的组件做好准备。 后一种情况看“无锁”,“等待”范式。乍一看看起来像火箭科学,但与“通常的锁定”相比,可以帮助你实现梦幻般的表现。