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

Gau*_*oni 288 objective-c automatic-ref-counting declared-property

有人能详细解释给我时,我必须使用各个属性:nonatomic,copy,strong,weak,等,为申报财产,并解释每个做什么?某种例子也会很棒.我正在使用ARC.

iDh*_*val 557

这个答案有很多错误,也已经过时了.请参阅其他问题/答案和评论.


非原子

nonatomic用于多线程目的.如果我们在声明时设置了非原子属性,那么任何其他想要访问该对象的线程都可以访问它并提供有关多线程的结果.

复制

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

分配

Assign有点相反copy.调用assign属性的getter时,它返回对实际数据的引用.通常,当您具有基本类型的属性(float,int,BOOL ...)时使用此属性

保留

retain当属性是指向对象的指针时,是必需的.生成的setter @synthesize将保留(也称为保留计数)对象.完成后,您将需要释放该对象.通过使用retain,它将增加保留计数并占用自动释放池中的内存.

强大

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

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

weak类似于strong它不会将引用计数增加1.它不会成为该对象的所有者,而只是拥有对它的引用.如果对象的引用计数降为0,即使您可能仍在此处指向它,它也将从内存中释放.

以上链接包含有关弱和强的良好信息.

  • `nonatomic`意味着它不应该被多个线程同时访问.默认为`atomic`,使线程安全. (10认同)

Ank*_*ava 45

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

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

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

copy这里的财产很好解释

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

希望这有助于你...


Mic*_*lum 17

这个链接有分解

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

assign意味着__unsafe_unretained所有权.

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

保留意味着__strong所有权.

强烈意味着__strong所有权.

unsafe_unretained意味着__unsafe_unretained所有权.

弱意味着__弱所有权.


Dad*_*dyM 9

很棒的答案!我想更深入澄清的一件事是nonatomic/ atomic.用户应该明白这个属性 - "原子性"只在属性的引用上传播,而不是在它的内容上传播.即atomic保证用户读取/设置指针的原子性以及仅指向属性的指针.例如:

@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
Run Code Online (Sandbox Code Playgroud)

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

如果您需要线程安全收集,您可能有不良架构(更常见)或真正需求(更罕见).如果它是"真正的要求" - 您应该找到好的和经过测试的线程安全收集组件,或者为编写自己的组件做好准备.后一种情况看"无锁","等待"范式.看起来像火箭科学乍一看,但与"通常的锁定"相比,可以帮助你实现梦幻般的表现.