美文网首页iOS开发实用技术iOSiOS开发基础篇
整理一下OC中的那些属性修饰符

整理一下OC中的那些属性修饰符

作者: iOS小孟和小梦 | 来源:发表于2016-04-11 23:21 被阅读3938次

    首先从简单到复杂大致分个类

    1. 自定义getter | setter方法名修饰符 : getter和setter
    2. 原子性修饰符:atomic | nonatomic
    3. 读写性修饰符:readwrite | readonly
    4. setter相关修饰符:assign | retain | copy

    方法名修饰符

     • getter=<getMethodName>,setter=<setMethodName>:指定该属性所使用的getter和setter方法的名称
    

    这两个属性修饰符用于设置自定义生成的getter和setter方法名,使用之后将不再使用系统默认的setter和getter方法名
    • 用得不是很多,使用场景一般是对BOOL属性设置该getter方法,比如 isGood 这样用以方便判断时使用


    Snip20160411_11.png

    原子修饰符

    • atomic  :  原子属性,为setter方法加锁  (默认) (类似多线程中的互斥锁)   
            § 线程安全,但需要消耗大量资源
    • nonatomic  :  非原子属性,不为setter方法加锁
            § 非线程安全,适合内存小的移动设备
    

    读写性修饰符

     • readwrite:表明这个属性是可读可写的,系统为我们生成这个属性的setter和getter方法以及下划线开头的成员变量。
     • readonly:表明这个属性只能读不能写,系统只为我们生成一个getter方法下划线开头的成员变量,不会创建setter方法
    

    注意!

    • 用readwrite自动生成setter和getter方法以及下划线开头的成员变量的时候,如果手动实现了setter和getter方法,那么系统将不会生成下划线开头成员变量
    Snip20160411_16.png
    Snip20160411_17.png
    • 同理,readonly自动生成getter 方法和_开头成员变量时,如果手动实现了getter方法,那么系统也不会再生成下划线开头的成员变量
    Snip20160411_18.png
    Snip20160411_19.png

    setter相关修饰符

    • retain:针对对象类型进行内存管理(非ARC)。当给对象类型使用此修饰符时,setter方法会先将旧的对象属性release掉,再对新的对象进行一次赋值并进行一次retain操作
    • assign:表示直接赋值, 基本数据类型、枚举、结构体(非OC对象) class类型
             当一个对象被销毁时,指针不会被清空(所以修饰对象时容易造成坏内存 (非ARC下会用这个修饰对象)
    

    • copy:以前主要用在NSString类型和Block,建立一个索引计数为1的对象,然后释放旧对象。
    • strong :除NSString\block以外(注意!这是以前的说法)的OC对象 , 强引用以保证属性作用域结束后不被销毁
    • weak : 当一个对象被销毁时,指针被清空
             一般用在已经添加到父控件中的控件,因为父控件会对子控件进行引用,也就是retain,所以自己的作用域结束之后不会被释放
    

    系统默认属性是assign。retain是指针的复制,copy是内容的复制


    用copy修饰字符串时---->>
      在setter方法中会判断 传入的字符串 是否是可变的
      如果是可变的就分配新的内存再赋值
      如果是不可变的就直接赋值地址
      而实际上开发中其实大量使用的是不可变的字符串   所以最好使用 strong 修饰字符串,可以提升性能(减少一次判断)
    

    用copy修饰Block时---->首先要知道Block在非ARC和ARC下的区别
    非ARC环境下:
      block访问外部局部变量,block存放栈里面
      只要block访问变量,而且是整个app都存在的变量,那么肯定在全局区
      在非ARC中.不能使用retain引用block,因为不会放在堆里面,在非ARC中只能使用copy,才会把block放在堆里面
    
    ARC环境下:
      只要block访问了外部局部变量,block就会存放到堆里面
      可以使用strong去引用  因为本身就已经是存放在堆区了
      也可以用copy,但是用stong性能更好
    

    做个小总结(只说ARC环境下的)

    用strong修饰OC对象以及NSString和Block , 没添加到父控件上的控件
    用weak修饰已经被添加到父控件上的控件 以及 代理对象
    用assign基本数据类型、枚举、结构体(非OC对象) class类型
    用copy修饰一种情况下的NSString-->不确定赋值过程中用的是可变还是不可变字符串

    相关文章

      网友评论

      • e0f6992dbc10:是重写了getter才没有生成带下划线的成员变量了吧,如果只重写setter还是可以用的

      本文标题:整理一下OC中的那些属性修饰符

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