Writability
下面的两个属性决定属性的的访问权限
readonly
表明属性是只读,只需要提供getter函数即可。但是假如你还提供@synthesize那么只有getter方法是synthesized
readwrite
表明声明的属性是read/write的,可读也可写。这个属性默认直接提供getter和setter。同时假如你提供了@synthesize那么getter/setter同时是synthesized
总结:无论是默认getter还是默认setter要想线程安全据需要使用@synthesize
Setter Semantics(setter讲义)
下面的一系列属性控制都是互斥的
strong
strong对于被声明的变量声明一种强的从属(owning)关联关系
weak
weak对于被声明的属性声明了一种非从属(non-owning)关系.
加入主被释放,那么weak声明的会被自动设置为nil(OSv10.6/iOS4之后,采用assign替代)
copy
表明被copy的object是被用于赋值的
对被copy的主体发送一个release消息
对于被声明copy的属性会触发一个copy方法。此属性只适合class类型的,并且还必须组训NSCopying协议
assign
作为默认的属性声明,表明这是一个简单的setter赋值
这个属性只针对简单的数据类型,比如NSInteger,CRect
retain
表明在赋值的时候retain应该被调用
对于原有的数据会发送一个release消息
Atomicity
使用nonatomic/atomic表明访问是否是原子性的,在OC中默认采用的原子性
nonatomic
声明为非原子性,多线程访问不安全
默认情况下属性是atomic的,因此在多线程下提供基于getter和setter分别的线程安全访问
假如你提供了strong,copy和retain俺的没也提供nonatomic,然后在引用计数的环境下访问的getter和setter都是基于lock实现的
大概代码如下:
代码语言:javascript复制[_internal lock]; // lock using an object-level lock
id result = [[value retain] autorelease];
[_internal unlock];
return result;
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/ObjectiveC/Chapters/ocProperties.html#//apple_ref/doc/uid/TP30001163-CH17