属性关键字分类
- 读写权限
- 原子性
- 引用计数
读写权限
readonly
readwrite(默认)
原子性
-
atomic(默认)
atomic所修饰的对象是如何保证线程安全的?
所修饰的属性,保证赋值和获取是线程安全的
例如:对一个数组使用atomic进行修饰,当对数组进行赋值或者获取时是可以保证线程安全的,如果对数组进行删除或插入对象的操作,atomic就不能再保证其线程安全了
nonatomic
引用计数
retain(MRC)/strong(ARC):用于修饰对象
assign(即可修饰基本数据类型也可修饰对象类型)/unsafe_unretained(MRC)
week
copy
assign
和week
的区别?
- assign可用来修饰基本数据类型,也可用来修饰对象类型,当不会改变其引用计数,assign在修饰对象时,对象释放时,assign指针仍然会指向原对象的内存地址,如果继续访问原对象,就会产生悬垂指针,导致内存泄漏和程序异常
- week不改变被修饰对象的引用计数,用于解决循环引用,所指对象在被释放后会自动置为nil
week
所修饰的对象在被释放时,为什么指针会自动置为nil?
内存管理相关
如果使用copy修饰可变数组会导致什么问题?
@property(copy)NSMutableArray *array;
- 此问题涉及到了浅拷贝和深拷贝
- 如果赋值过来的是可变数组NSMutableArray,copy是深拷贝,同时目标对象是不可变数组NSArray;
- 如果赋值过来的是不可变数组NSArray,copy是浅拷贝,同时目标对象是不可变数组NSArray;
-
由于原对象是可变的,可能会进行一些移除或插入的操作,此时由于copy的结果是不可变对象,如果此时进行移除或插入操作,就会引起程序异常
- 对于可变对象,无论进行copy还是mutablecopy都是深拷贝
- 对于不可变对象,进行copy是浅拷贝,进行mutablecopy是深拷贝
- 对于可变或不可变对象,进行copy,获取的目标对象都是不可变的
- 对于可变或不可变对象,就行mutablecopy,获取的目标对象都是可变的
浅拷贝
深拷贝
浅拷贝VS深拷贝
- 是否开辟了新的内存空间
- 是否影响的引用计数