nonatomic
、copy
、strong
、weak
等的情况,并解释每个属性的作用吗?最好能提供一些例子。我正在使用ARC(自动引用计数)。nonatomic
、copy
、strong
、weak
等的情况,并解释每个属性的作用吗?最好能提供一些例子。我正在使用ARC(自动引用计数)。Nonatomic
不会通过 @synthesize
存取方法生成线程安全的程序。使用 atomic
会生成线程安全的存取器,因此 atomic
变量是线程安全的(可以在多个线程中访问而不会破坏数据)。
copy
当对象可变时才需要使用。如果您需要该对象的当前值,并且不希望该值反映其他所有者所做的任何更改,则使用此选项。完成后,您需要释放该对象,因为您正在保留其副本。
assign
与 copy
相反。调用 assign
属性的 getter 方法时,它返回对实际数据的引用。通常,在具有原始类型(float、int、BOOL 等)的属性上使用此属性。
retain
当属性是指向在堆上分配的引用计数对象的指针时,就需要使用了。分配应该类似于:
NSObject* obj = [[NSObject alloc] init]; // ref counted var
@synthesize
生成的setter方法在对象被复制时会增加引用计数,因此即使原始副本超出范围,底层对象也不会自动销毁。
当您使用@property
并使用retain
时,需要在完成后释放该对象,这将增加引用计数并占用autorelease池中的内存。
strong
是Objective-C自动引用计数(ARC)的一部分,是对retain
属性的替代。在非ARC代码中,它只是retain
的同义词。
这是一个学习关于iOS 5中强引用(Strong)和弱引用(Weak)的好网站。 http://www.raywenderlich.com/5677/beginning-arc-in-ios-5-part-1
弱引用(Weak)
weak
与strong
类似,但它不会使引用计数加1。它不成为该对象的所有者,只是持有一个对它的引用。如果对象的引用计数降至0,即使您仍然在此处引用它,它也将从内存中释放。
以上链接包含有关弱引用(Weak)和强引用(Strong)的良好信息。
nonatomic
的意思是它不应该被多个线程同时访问。默认值是 atomic
,这使它在多线程环境下是线程安全的。 - wcochrannonatomic
属性意味着@synthesize
方法不会生成线程安全,但这比atomic
属性更快,因为额外的检查被消除了。
strong
与ARC一起使用,它基本上帮助你不必担心对象的保留计数。当你完成它时,ARC会自动释放它。使用关键字strong
意味着你拥有该对象。
weak
所有权意味着你不拥有它,它只是跟踪分配给它的对象,只要第二个对象被释放,它就失去了值。例如,obj.a=objectB;
被使用且a具有弱属性,则其值仅在objectB保留在内存中时有效。
copy
属性非常好地解释在此处
strong,weak,retain,copy,assign
是相互排斥的,所以你不能在一个对象上同时使用它们...请阅读“已声明的属性”部分。
希望这能对你有所帮助...
这个链接有详细的分解
http://clang.llvm.org/docs/AutomaticReferenceCounting.html#ownership.spelling.property
assign 表示__unsafe_unretained所有权。
copy 表示 __strong所有权,以及setter方法中常见的拷贝语义行为。
retain 表示__strong所有权。
strong 表示__strong所有权。
unsafe_unretained 表示__unsafe_unretained所有权。
weak 表示__weak所有权。
非常好的回答!
有一件事我想更深入地澄清,那就是nonatomic
/atomic
。
用户应该明白,这个属性——“原子性”仅扩展到属性的引用,而不是它的内容。
也就是说,atomic
只能保证用户在读取/设置指向属性的指针时具有原子性。
例如:
@interface MyClass: NSObject
@property (atomic, strong) NSDictionary *dict;
...
dict
的指针。
但是,dict
本身(指向的字典dict
)仍然不是线程安全的,即对字典的所有读取/添加操作仍然不是线程安全的。