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


Answers:


559

这个答案有很多错误,而且已经过时了。请查看其他问题/答案和评论。


非原子

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

复制

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

分配

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

保留

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

强大

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

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

weakstrong与之类似,不同之处在于它不会将引用计数增加1。它不会成为该对象的所有者,而仅持有对该对象的引用。如果对象的引用计数下降到0,即使您在此处仍指向它,它将从内存中释放。

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


1
如果您仅在该类内部内部使用此NSString而不是甚至不需要属性,则可以将其设置为iVar;如果在其他类中使用它,我将不建议您这样做(强复制)。
Ankit Srivastava 2012年

1
您缺少分配属性。
mskw

10
nonatomic意味着它应该被同时被多个线程访问。默认值是atomic使其线程安全。
wcochran 2015年

1
在所有这些时间之后,非原子的定义仍然是错误的,并且类似于原子,这令人有些不安。我想知道在过去五年中有多少人使用过此工具,并给人留下了错误的印象。@wcochran说的是正确的。非原子意味着对指针的访问不是原子处理的,因此不是线程安全的。据我了解,非原子的好处是重量更轻。
约翰·布什内尔

1
除了@JohnBus​​hnell的评论外,此答案还有很多其他错误和不准确之处。它也老化得不好,所以有一定的历史意义。如果您想找到这个问题的答案,请去别处。
CRD

45

nonatomic 属性指出该对象不是线程安全的,这意味着如果其他线程尝试访问该对象的情况可能发生不良情况,但这比原子属性快得多。

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

weak所有权意味着您不拥有它,它只会跟踪对象,直到分配给它的对象停留为止,一旦释放第二个对象,它便失去了价值。例如。obj.a=objectB;使用且具有弱属性,则其值仅在objectB保留在内存中之前才有效。

copy属性在这里很好解释

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

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


为什么要强,弱,保留,复制,分配互斥
vinoth.kumar,2015年

nonatomic仅表示不应用排除。这并不意味着访问不是线程安全的。这是atomicvs. nonatomic无法捕获的实现细节。
bbum

@bbum您能解释不排除线程安全与否的区别吗?
Ankit Srivastava

1
@AnkitSrivastava 排除是当线程A阻止线程B沿代码路径前进时。如果该代码路径可以安全地从多个线程执行,则不需要排除。 不是线程安全的,这意味着如果A和B同时退出,则代码路径可能会产生不确定的结果。那是可以用来使线程安全的东西被排除在外,但是线程安全不需要排他的非并行执行。
bbum

17

该链接有故障

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

Assign表示__unsafe_unretain所有权。

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

保留意味着__strong所有权。

强意味着__strong所有权。

unsafe_unretained隐含__unsafe_unretained所有权。

弱表示__弱所有权。


分配属性不是仅用于iVar和值吗?那么,为什么它不安全?为什么需要注意它没有保留?
mskw

9

好答案!我想更深入地阐明的一件事是nonatomic/ atomic。用户应了解,此属性-“原子性”仅在属性的引用上传播,而不在属性的内容上传播。即atomic会保证用户原子读取/设置指针,只有指针属性。例如:

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

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

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

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.