前言
声明类的属性时,总会带上关键字,但是这些关键字代表什么,为什么要写,今天来看一下吧
一、atomic与nonatomic
这部分整理自一篇12年的文章 IOS开发之属性详解
** atomic**:原子操作(原子操作代表着事物的一个完整操作,成功就提交,失败就回滚),oc中默认是atomic,也就是setter/getter是一个原子操作。在一个线程没有执行完setter/getter之前,其他线程无法执行setter/getter。相当于给函数加锁,避免了该属性读写不同步的问题。
nonatomic 非原子操作 用于不需要多线程支持的时候,减少程序生成互斥加锁代码。提高并发访问的效率。oc中通常属性类型都会声明为nonatomic。如果程序中多个线程用到同一属性,同时需要数据同步,需要使用atomic,或者使用atomic然后手动加锁。
声明关键字atomic/nonatomic相当于为属性设置setter和getter。因此需要配合@synthesize/@dynamic才有意义。
以下这段复制过来,第一个明白,是重写setter和getter的方法,第二个不太明白
@synthesize 如果不实现setter和getter方法,编译器将会自动在生产setter和getter方法。
@dynamic 表示变量对应的属性访问器方法,是动态实 现的,你需要在NSObject 中继承而来的+(BOOL) resolveInstanceMethod:(SEL) sel 方法中指定动态实现的方法或者函数。
二、setter与getter
可以直接写getter=XXX;或者setter=XXX;
@property (nonatomic, getter = isMatched) BOOL matched;
使用的时候
if(card.isChosen){
card.chosen = NO;
}
涉及到点语法,本来的get方法是card.chosen 改写了 card.isChosen。
三、readwrite与readonly
- readwrite:默认是readWrite,可以用来赋值,也可以用来被赋值,有getter和setter。
- readonly:只能用来赋值,不能被赋值,有getter没有setter。
四、strong与weak
- strong:强引用,直接决定决定对象的存亡。当不存在指向一个对象的强引用,并且对象不再显示在列表。该对象就被从内存中释放。同生共死吧
- weak:弱引用,不决定对象的存亡,即使一个对象被持有无数个弱引用,只要没有一个强引用指向对象,对象也会被从内存中释放。
五、copy、retain与assign
下图来源《Objective-C高级编程 iOS与OS X多线程和内存管理》
A1A503F9-F961-40C4-B3CD-3BA2BC25188C.png- assign:默认类型,setter方法直接赋值,不进行任何retain操作,不改变引用计数。一般用来处理基本数据类型。
- copy:创建一个新的对象,引用计数重置为1,开辟出一块新的内存空间
- retain:创建一个新的指针,引用计数加1,与之前的指针指向同一块内存空间
也可以直接使用:
- 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
- 使用copy: 对NSString
- 使用retain: 对其他NSObject和其子类
这块在上面提到的书中有很详细的介绍,我看过了之后再来单开一章。
文章来源
IOS开发之属性详解
IOS开发@property 属性类型归纳和介绍
《Objective-C高级编程 iOS与OS X多线程和内存管理》
网友评论