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