重读OC属性声明

2019-10-09 15:12:08 浏览数 (1)

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

关注公众号查看更多关注公众号查看更多

0 人点赞