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


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

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

方法名修饰符

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

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


整理一下OC中的那些属性修饰符_第1张图片
Snip20160411_11.png

原子修饰符

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

读写性修饰符

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

注意!

• 用readwrite自动生成setter和getter方法以及下划线开头的成员变量的时候,如果手动实现了setter和getter方法,那么系统将不会生成下划线开头成员变量
整理一下OC中的那些属性修饰符_第2张图片
Snip20160411_16.png

整理一下OC中的那些属性修饰符_第3张图片
Snip20160411_17.png

• 同理,readonly自动生成getter 方法和_开头成员变量时,如果手动实现了getter方法,那么系统也不会再生成下划线开头的成员变量
整理一下OC中的那些属性修饰符_第4张图片
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-->不确定赋值过程中用的是可变还是不可变字符串

你可能感兴趣的:(整理一下OC中的那些属性修饰符)