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