1,读写性修饰符(访问权限):readwrite | readonly
readwrite - 默认, 可读可写(系统自动创建getter 和 setter 方法)
readonly - 只读,系统只会生成 getter方法!
2,原子性修饰符(线程安全): nonatomic | atomic
atomic - 默认,线程安全
1.atomic原子性指的是一个操作不可以被CPU中途暂停,然后再调度。即不能被中断,要么就执行完,要么就不执行
2.atomic是自旋锁,当上一线程没有执行完毕的时候(被锁住),下一个线程会一直等待(不会进入睡眠状态),当上个线程任务执行完毕,下一线程立即执行。它区别于互斥锁,互斥锁在等待的时候,会进入睡眠状态,当被上一线程执行完毕后,会被唤醒,然后再执行。
3.atomic只给setter方法上锁,getter不会加锁
4.atomic需要消耗大量的资源,执行效率低!
nonatomic - 线程不安全,但是效率高
3, 内存管理(ARC):assign | retain | copy | strong | week |
assign - 默认, 表示直接赋值!
适用于基本数据类型(NSInteger和CGFloat) ,还有id类型和C的数据类型(int,float, double, char...).
这个修饰符不会牵涉到内存管理!但是如果是对象类型,使用此修饰符则可能会导致内存泄漏或EXC_BAD_ACCESS错误!
retain - 指针拷贝(指针拷贝后,地址不变,内容不变,引用计数器加1!,适用NSObject和其子类)
copy - 内容拷贝(内容被拷贝后,内存中会有两个存储空间存储相同的内容,指针不是同一个地址!NSString)
strong - 强引用(强引用,只有OC对象才能够使用该属性,它使对象的引用计数加1,它指向的是同个地址)
week - 弱引用(不会使对象的引用计数器加1)代理必须是weak,因为代理一般都是指向控制器,会造成循环引用,无法释放,造成内存泄露
4,getter和setter修饰符
这两个属性修饰符用于设置自定义生成的getter和setter方法名!
关于weak 与assign区别:
在ARC,出现循环引用的时候,必须有一端使用weakweak修饰的对象销毁的时候,指针会自动设置为nil而assign不会,assign可以用于非OC对象,而weak必须用于OC对象