(五)property中的属性关键字

2017-06-27  本文已影响9人  叔叔不吃棒棒糖

前言

声明类的属性时,总会带上关键字,但是这些关键字代表什么,为什么要写,今天来看一下吧

一、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

四、strong与weak

五、copy、retain与assign

下图来源《Objective-C高级编程 iOS与OS X多线程和内存管理》

A1A503F9-F961-40C4-B3CD-3BA2BC25188C.png

也可以直接使用:
- 使用assign: 对基础数据类型 (NSInteger,CGFloat)和C数据类型(int, float, double, char, 等等)
- 使用copy: 对NSString
- 使用retain: 对其他NSObject和其子类
这块在上面提到的书中有很详细的介绍,我看过了之后再来单开一章。
文章来源
IOS开发之属性详解
IOS开发@property 属性类型归纳和介绍
《Objective-C高级编程 iOS与OS X多线程和内存管理》

上一篇 下一篇

猜你喜欢

热点阅读