OC中的修饰符
首先从简单到复杂大致分个类
- 方法名修饰符:getter、setter
- 原子性修饰符:atomic|、nonatomic
- 读写性修饰符:read、write、readonly
- set属性修饰符:assign、retain、copy方法名修饰符
方法名修饰符
getter和setter属性修饰符:用于设置自定义生成的getter和setter方法名,使用之后将不再使用系统默认的setter和getter方法名,用得不是很多,使用场景一般是对BOOL属性设置该getter方法,比如 isGood 这样用以方便判断时使用。
原子修饰符
•atomic : 原子属性,为setter方法加锁 (类似多线程中的互斥锁) ,默认值 ,虽然线程安全,但需要消耗大量资源 。
•nonatomic : 非原子属性,不为setter方法加锁 ,非线程安全,适合内存小的移动设备,读写性修饰符
读写性修饰符
• readwrite:表明这个属性是可读可写的,系统为我们生成这个属性的setter和getter方法以及下划线开头的成员变量。
• readonly:表明这个属性只能读不能写,系统只为我们生成一个getter方法下划线开头的成员变量,不会创建setter方法
注意:
• 用readwrite自动生成setter和getter方法以及下划线开头的成员变量的时候,如果手动实现了setter和getter方法,那么系统将不会生成下划线开头成员变量
setter相关修饰符
• retain:针对对象类型进行内存管理(非ARC)。当给对象类型使用此修饰符时,setter方法会先将旧的对象属性release掉,再对新的对象进行一次赋值并进行一次retain操作
• copy:以前主要用在NSString类型和Block,建立一个索引计数为1的对象,然后释放旧对象。
• weak : 当一个对象被销毁时,指针被清空,一般用在已经添加到父控件中的控件,因为父控件会对子控件进行引用,也就是retain,所以自己的作用域结束之后不会被释放。
Copy其实是建立了一个相同的对象,而retain不是:
比如一个NSString对象,地址为0×1111,内容为@”STR”
Copy到另外一个NSString之后,地址为0×2222,内容相同,新的对象retain为1,旧有对象没有变化
retain到另外一个NSString之后,地址相同(建立一个指针,指针拷贝),内容当然相同,这个对象的retain值+1
也就是说,retain是指针拷贝,copy是内容拷贝。哇,比想象的简单多了…
系统默认属性是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
不确定赋值过程中用的是可变还是不可变字符串
**属性修饰符简单总结:**
基本数据类型用assign,对象用strong,代理和UI控件用weak,字符串用copy!
1、assgin 适用于对基本数据类型(int,float等)的简单赋值操作
2、strong 这个属性特质表示一种拥有的关系,setter方法设置新值的时候会先保留属性的新值,然后释放旧值,最后将新值赋值给属性
3、weak 表示一种非拥有的关系。setter方法设置新值的时候不会先保留属性的新值,也不会释放旧值,只是将新值赋值给属性,与assign不同的是该内存管理特性会在属性所指的对象销毁时,将属性置为nil,更加安全
4、unsafe_unretained 与assign类型类似。适用于"对象"类型的赋值,表达的是一种非拥有(unretained)的关系,当属性所指的对象被销毁时,属性值不会自动被自动清空;
5、copy 如字面意思,该特质的setter方法不会保留新值,而是将其拷贝,当属性类型为NSString时候,可以用这个特质来确保属性的值不会被其他对象修改。
因为传递给setter方法的新值有可能是一个指向NSMutableString类型的实例,若是不拷贝字符串,那么该字符串有可能在对象不知情的情况下被其他对象修改,导致意外的结果。