最熟悉的陌生人 ? 应该是最熟悉的熟悉人
atomic, nonatomic, assign, weak, strong, copy, retain, nullable, nonnull, readwrite, readonly
-
nonatomic
非原子属性, 非线程安全的, 对性能损耗低, 开发中一般用nonatomic, 系统默认是atomic, 所以每次都要用nonatomic去修饰属性.
-
atomic
原子属性, 系统自动在setter和getter方法加了锁, 性能损耗高, 开发中一般不用.
-
assign
修饰基本数据类型(NSInteger/Float/Double/Bool...), 基本数据类型分配在栈中, 内存由系统管理. 若修饰对象类型, 再访问对象会报错野指针错误, 对象类型分配在堆中, 而assign不进行强引用, 对象基本上一创建就被释放, 然而指针不为nil, 指针指向被释放了的对象就报错.
-
weak
同样不会增加引用计数, 跟assign不同,
weak只能修饰OC对象类型
, 并且是弱引用, 当对象被释放的时候, 指针也会置为nil, 就不会出现野指针.一般用在修饰IBOutlet控件属性 / delegate
, 而block属性对象在内部使用self或者其他强引用对象时候, 需要使用__weak弱引用 -
strong
修饰对象类型, retain+1, 并且是在ARC环境下使用.
-
retain
也是继续是对象类型, 只能在MRC环境下使用
-
copy
一般修饰不可变对象, NSString/NSArray/NSDictionary等, 还修饰 block属性, 会将block对象从栈区复制一份到堆区, 避免过早释放.
-
nonnull
对象的值不允许空
-
nullable
对象的值允许为空
-
null_unspecified
不设定是否非空
实际里还有
_Null_unspecified / _Nullable / _Nonnull
, 意思跟对应的null_unspecified / nullable / nonnull
是一样的, 只是放的位置不一样.
-
readwrite
读写属性, 默认就是读写属性, 系统自动创建setter和getter方法.
-
readonly
只读属性, 不允许改变属性值, 系统只创建getter方法