首先从简单到复杂大致分个类
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 这样用以方便判断时使用
原子修饰符
• atomic : 原子属性,为setter方法加锁 (默认) (类似多线程中的互斥锁)
§ 线程安全,但需要消耗大量资源
• nonatomic : 非原子属性,不为setter方法加锁
§ 非线程安全,适合内存小的移动设备
读写性修饰符
• readwrite:表明这个属性是可读可写的,系统为我们生成这个属性的setter和getter方法以及下划线开头的成员变量。
• readonly:表明这个属性只能读不能写,系统只为我们生成一个getter方法下划线开头的成员变量,不会创建setter方法
注意!
• 用readwrite自动生成setter和getter方法以及下划线开头的成员变量的时候,如果手动实现了setter和getter方法,那么系统将不会生成下划线开头成员变量
• 同理,readonly自动生成getter 方法和_开头成员变量时,如果手动实现了getter方法,那么系统也不会再生成下划线开头的成员变量
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性能更好