1. nonatomic
非原子性,允许多线程并发访问,性能高。但是访问不安全,直接访问内存值,nonatomic不为setter方法加锁。
系统中一般都使用nonatomic。
2. atomic
原子性,保证线程安全,但是消耗系统资源。atomic为setter方法加锁。
系统默认使用atomic。
3. readonly
只读属性,无法修改,只有getter方法,无setter方法。
4. readwrite
读写属性,默认为读写,系统自动创建setter / getter方法。
5. strong
默认修饰符,strong修饰的对象在引用计数为0时销毁。
6. assign
弱引用声明类型,一般用于修饰基本数据类型。
用assign修饰的对象,对象的引用计数为0时,对象释放后,只能地址不会置为nil,就会出现野指针,所以一般不能使用assign修饰对象。
问:为什么assign能修饰基本数据类型?
答:基础数据类型的内存是分配到栈区上,栈区内存是由系统自动处理的,不会造成野指针。
7. weak
弱引用声明类型,一般用来防止循环引用和修饰delegate。
用weak修饰的对象,对象引用计数为0时,对象释放的同时指针地址置为nil。
8. copy
用copy修饰的对象是不可改变的。相当于在调用对象的set方法时,新拷贝了一份(深拷贝和浅拷贝见下面解释)。
深拷贝:真正的复制了一份,赋值的对象指向了新的地址。
浅拷贝:非真正的复制,而是复制的对象和原对象都指向同一个地址。
问:什么意思?什么叫不可改变的?
答:举个栗子:使用copy属性声明一个对象a,在声明一个对象b同时给对象b赋值,把b的值赋值给a,然后改变对象b的值,这个时候打印结果,b为新赋的值,a则还是b第一次赋的值。
备注:self.bArray = bArray; 相当于方法 self.bArray = [bArray copy];