有人能详细地向我解释一下什么时候必须为声明的属性使用每个属性:非原子属性、复制属性、强属性、弱属性等等,并解释每个属性的作用吗?举个例子也很好。我使用的是ARC。


当前回答

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

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

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

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

其他回答

这个链接已经失效了

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

Assign意味着__unsafe_unretained所有权。 Copy意味着__强所有权,以及通常的Copy行为 setter的语义。 Retain表示强烈的所有权。 Strong意味着__strong所有权。 Unsafe_unretained意味着__unsafe_unretained所有权。 Weak意味着__weak所有权。

非原子属性意味着@ synthetic方法不会被生成为线程安全的——但这比原子属性快得多,因为消除了额外的检查。

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

弱所有权意味着你不拥有它,它只是跟踪对象,直到它被分配给的对象留下来,一旦第二个对象被释放,它就失去了它的价值。如。obj.a = objectB;如果a的属性为weak,则它的值只有在objectB仍然存在于内存中时才有效。

复制属性在这里有很好的解释

强,弱,保留,复制,赋值是互斥的,所以你不能在一个对象上使用它们…阅读“声明属性”部分

希望这对你有所帮助……

原子

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

Copy

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

分配

赋值在某种程度上与复制相反。当调用赋值属性的getter时,它返回一个对实际数据的引用。通常当你有一个基本类型的属性(float, int, BOOL…)

保留

当属性是指向分配在堆上的引用计数对象的指针时,则需要Retain。分配应该是这样的:

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

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

当你完成对象时,你需要释放它。@ propertyys使用retain会增加引用计数并占用自动释放池中的内存。

强大的

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

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

Weak

Weak与strong相似,只是它不会将引用计数增加1。它不会成为该对象的所有者,而只是保存对该对象的引用。如果对象的引用计数下降到0,即使您可能仍然在这里指向它,它将从内存中释放。

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

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

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

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

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