我们开发的时候,定义变量的时候,会给变量定义响应的属性。
在ARC情况下,默认属性有:atomic,readwrite,如果是指针类型默认:strong,简单变量:assign。
在MARC情况下,默认属性有:atomic,readwrite,如果是指针类型默认:retain,简单变量:assign。
其中还有其他的属性,例如:retain,nonatomic,readonly,weak,unsafe_unretained,copy。
当在MARC情况下,atomic,nonatomic,readwrite,readonly,retain,copy,assign都可以使用。
在ARC情况下,在MARC下又增加strong,unsafe_unretained,weak属性。
注意,在ARC情况下,定义Block对象时,strong和copy效果是一样,现在定义Block的时候,都是写成copy属性,如果写成strong,效果和copy一样的。
以下一些说法,都是在ARC情况下,
@property NSUInteger costLimit;
//默认是atomic, readwrite,assign
@property (nonatomic, copy) NSString *carNo;
//nonatomic,readwrite,copy,其中注意,在赋值的时候,要执行拷贝操作
atomic:原子操作,提供多线程安全操作,相当于加了无形锁操作,但也不是绝对安全。
nonatomic:非原子操作,禁止多线程,提高性能。
readwrite:读写权限
readonly: 只读权限,如果不想把变量在外部修改,定义这个属性,防止外部修改,只用本类中修改这个变量。
assign:简单变量定义。
retain和strong、copy都是针对的指针变量,将拥有指针的所有权。
weak:没有拥有指针的所有权,当指向它的变量释放的时候,weak定义的变量,也将自动释放。
unsafe_unretained:没有拥有指针的所有权,当指向它的变量释放的时候,unsafe_unretained定义的变量,不会自动释放。这个属性定义的变量,在使用的时候,要检查指向它的变量是否已经释放,如果释放,在使用,程序会崩溃的。
nullable:表示变量可以null或者nil。
nonnull:表示变量不能为空。
NS_ASSUME_NONNULL_BEGIN与NS_ASSUME_NONNULL_END之间定义的变量都是nullable,如果不想为nullable,必须定义nonnull标记了。
null_unspecified :不确定是否为空。
null_resettable setter 可以为空, getter 不为空。
网友评论