美文网首页
(五)property中的属性关键字

(五)property中的属性关键字

作者: 叔叔不吃棒棒糖 | 来源:发表于2017-06-27 17:57 被阅读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

    • 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多线程和内存管理》

    相关文章

      网友评论

          本文标题:(五)property中的属性关键字

          本文链接:https://www.haomeiwen.com/subject/jcmecxtx.html