iOS开发中属性修饰词的区别
-
strong
直接赋值,强引用,持有对象,引用计数+1,相当于MRC下的Retain。 -
weak
直接赋值,弱引用(可打破循环引用),不持有对象,引用计数不变,修饰的对象释放后自动置为nil。只能修饰对象,不能修饰基本数据类型。 -
assign (系统默认)
直接赋值,弱引用,引用计数不变,用来修饰基本数据类型,属性默认是assgin修饰的。也可以用来修饰对象,但是对象销毁后不会置为nil,可能造成野指针。 -
copy
遵循NSCopying和 NSMutableCopying协议,分别返回可变和不可变对象。
MRC下,释放旧的对象,指针指向新的对象。
ARC下,如果是不可变对象Copy,没生成新对象,只会复制指针(浅拷贝),修改copy后的对象,原来的对象也会受影响(理解为两个指针访问同一个内容)。如果是可变对象copy,变为不可变对象,且生成一份新对象,复制一份内容(深拷贝),修改copy后的对象,原来的对象不受影响(理解为两个指针分别访问两份相同的内容)。PS:可变对象copy后变为不可变对象不可在调用add/remove/insert等函数方法,否则会导致Crash。
-
retain
相当于浅拷贝,只复制指针,不复制内容(几个指针可以共同访问同一个内容)。持有对象,引用计数+1。 -
nonatomic
非原子性操作,访问速度快,但是如果多个线程访问同一个属性,会出现数据竞争。 -
atomic(系统默认)
原子性操作,只是系统对于set/get方法操作会加入一个锁@synchronized()保证读写操作是完整的(比较消耗性能),不受其他线程影响,并不能保证线程安全。 -
readwrite (系统默认)
Xcode帮开发者生成Set和Get方法 -
readonly
Xcode帮开发者只生成Get方法(外界只可以访问不可以修改)