声明属性关键字分三种类型
原子性
atomic:默认值,访问时加锁,访问完解锁其他线程才能修改,是线程安全的;考虑性能iPhone开发中一般不用此值;
nonatomic:非线程安全,不能保证多线程环境的安全性,效率高,基本使用此值;
读写
- readwrite:默认关键字,可读可写,属性set、get方法都有;
- readonly:只读,属性值不能被外界修改,只有get方法;
- writeonly:只写,属性值不能被外界读取,只有set方法;
内存管理策略
- assign:默认值,MRC下可修饰OC对象,表示弱引用,ARC下用来修饰基本数据类型;
- retain:表示对对象的强引用,对象进行引用计数器+1,ARC下使用strong代替
- strong:ARC下使用,相当于retain,表示对对象的强引用;
- copy:只能修饰OC对象,会对赋值的对象进行拷贝。
- weak:ARC下使用,相当于assign,区别在于属性所指的对象遭到摧毁时,系统会将 weak 修饰的属性对象的指针置为 nil;
- unsafe_unretained:修饰OC对象,类似weak,表示弱引用,指向对象销毁后可能导致野指针,基本不使用;
扩展
- @synthesize: 自定义属性对应成员变量的名字
- @dynamic :告诉系统不要自动生成属性的setter和getter方法(一般要自定义setter和getter方法时使用)
iOS9之后新增的关键字
- nonnull:不可以为空
- nullable:可以为空
- null_resettable:get方法不能为空,set方法可以为空(注意:如果使用null_resettable,必须重写 get 方法或者 set 方法,处理传递的值为空的情况)
- __null_unspecified:不确定是否为空
- __kindof:类型为这个类或其子类(例如(nullable __kindof UITableViewCell *)表示返回值可以是UITableViewCell及其子类)