Objective-C声明@property属性(非原子,拷贝,强,弱)

有人可以向我详细解释当我必须使用每个属性: nonatomiccopystrongweak等等,为一个声明的属性,并解释什么? 某种例子也是很棒的。 我正在使用ARC。

非原子

nonatomic是用于多线程的目的。 如果我们在声明的时候设置了nonatomic属性,那么任何其他想要访问该对象的线程都可以访问它并给出关于多线程的结果。

复制

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

分配

Assigncopy相反。 调用assign属性的getter时,会返回实际数据的引用。 通常当你有一个基本类型的属性(float,int,BOOL …)时使用这个属性

保留

当属性是指向对象的指针时, retain是必需的。 由@synthesize生成的setter将保留(也就是添加一个保留计数)的对象。 完成后您需要释放对象。 通过使用保留会增加保留计数并占用autorelease池中的内存。

强大

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

这是一个很好的网站,了解iOS 5的strongweakhttp://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1

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

上面的链接包含关于弱和强的好信息

nonatomic属性指出该对象不是线程安全的,这意味着如果一个不同的线程试图访问这个对象比坏事情可能发生,但这比原子属性快得多。

strong与ARC一起使用,它基本上可以帮助你,不必担心对象的保留数。 ARC完成后会自动为您发布。使用关键字strong意味着您拥有该对象。

所有权weak意味着你不拥有它,它只是跟踪对象,直到被分配的对象停留,一旦第二个对象被释放,它就失去了价值。 例如。 obj.a=objectB; 被使用和一个弱的属性,它的值将只有有效,直到objectB留在内存中。

copy财产在这里很好地解释

strong,weak,retain,copy,assign是互斥的,所以你不能在一个单一的对象上使用它们…阅读“声明的属性”部分

希望这可以帮助你一点点…

这个链接有分解

http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property

分配意味着__unsafe_unretained所有权。

副本意味着__strong所有权,以及setter上复制语义的通常行为。

保留意味着__strong所有权。

强意味着__strong所有权。

unsafe_unretained意味着__unsafe_unretained所有权。

弱意味着所有权。

很好的答案! 我想深入澄清的一件事是非nonatomic / atomic 。 用户应该明白,这个属性 – “原子性”只传播在属性的引用而不是内容上。 即atomic将保证读取/设置指针的用户原子性和只有指向属性的指针。 例如:

 @interface MyClass: NSObject @property (atomic, strong) NSDictionary *dict; ... 

在这种情况下,保证指向dict的指针将被不同的线程以原子方式读取/设置。 但是dict本身(字典dict指向的)仍然是线程不安全的 ,即对字典的所有读取/添加操作仍然是线程不安全的。

如果你需要线程安全的收集,你要么有坏架构(更经常)或真正的要求(更罕见)。 如果这是“真正的要求” – 你应该找到好的和测试的线程安全收集组件或准备试写和你自己的磨难。 后一种情况看“无锁”,“无等”的范式。 乍看起来像火箭科学,但可以帮助你实现与“平常的锁定”相比的梦幻般的表现。