291

当我必须对声明的属性使用每个属性时,有人可以向我详细解释:nonatomic, copy, strong, weak, 等等,并解释每个属性的作用吗?某种例子也会很棒。我正在使用 ARC。

4

4 回答 4

560

非原子的

Nonatomic不会通过访问生成线程安全例程@synthesizeatomic将生成线程安全访问器,因此atomic变量是线程安全的(可以从多个线程访问而不会破坏数据)

复制

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

分配

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

保持

retain当属性是指向在堆上分配的引用计数对象的指针时是必需的。分配应类似于:

NSObject* obj = [[NSObject alloc] init]; // ref counted var

生成的 setter@synthesize将在对象被复制时添加一个引用计数,因此如果原始副本超出范围,则底层对象不会自动销毁。

完成后,您将需要释放该对象。@propertys usingretain会增加引用计数,占用自动释放池中的内存。

强的

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

这是一个了解iOS 5 strong的好网站。 http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1weak

虚弱的

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

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

于 2012-03-25T12:58:05.370 回答
44

nonatomicproperty 意味着不会生成线程安全@synthesize的d 方法——但这比atomicproperty 快得多,因为消除了额外的检查。

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

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

copy属性在这里得到了很好的解释

strong,weak,retain,copy,assign是互斥的,因此您不能在一个对象上使用它们...阅读“声明的属性”部分

希望这对您有所帮助...

于 2012-03-25T12:36:51.703 回答
16

这个链接有故障

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

assign 意味着 __unsafe_unretained 所有权。

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

保留意味着 __strong 所有权。

strong 意味着 __strong 所有权。

unsafe_unretained 意味着 __unsafe_unretained 所有权。

弱意味着 __weak 所有权。

于 2012-03-25T11:31:15.400 回答
7

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

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

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

如果您需要线程安全的集合,您要么有糟糕的架构(更常见),要么有真正的需求(更罕见)。如果这是“真正的要求” - 您应该找到经过良好测试的线程安全收集组件,或者为编写自己的测试和磨难做好准备。后一种情况着眼于“无锁”、“无等待”范式。乍一看就像火箭科学,但与“通常的锁定”相比,它可以帮助您实现出色的性能。

于 2015-03-15T13:12:21.700 回答