修饰符 | 描述 |
---|---|
nonatomic | 非原子性,决定编译器生成的setter、getter 方法是非原子操作,线程不安全 |
atomic | 原子性,保证setter和getter存取的线程安全,默认atomic |
readonly | 只读性,只生成getter方法 |
readWrite | 可读可写性,生成setter和getter方法,默认使用 |
assign | 赋值特性, setter方法将传入参数直接赋值给实例变量 |
retain | 持有特性,setter将传入参数先保留,在赋值,传入参数retainCount会+1 |
strong | 持有特性,和retain一样,多用于ARC |
copy | 拷贝特性,需要完全一份新的变量时setter方法将传入对象复制一份,一般用于block不可变的字符串,数组,字典等 |
weak | 弱引用,一般用来修饰delegate |
__unsafe_unretain | 当对象被释放后,指针依然保存着之前的地址 |
-
atomic:
设置成员变量的属性时,默认是atomic
,提供线程安全的。 添加一些线程锁,防止数据在写入未完成的时候被其他线程读取,造成数据错误,默认使用。
-
nonatomic:
非原子性,线程不安全,在写入的时候其他线程也可以对其进行访问,获取当前的值。优点:提高效率。
-
assign:
对基础数据进行赋值(NSInteger
,CGFloat
)和C数据类型(int
, float
,double
, char
),BOOL
类型等。存储在栈中,内存不用我们管理。
-
retain,strong(ARC):
一般用于修饰NSObject
和其子类,指向并持有该对象,引用计数会加1。引用计数为0销毁,可以通过将变量强制赋值 nil
来进行销毁。
-
copy:
在赋值是使用传入值的一份拷贝。copy
关键字和 strong
类似,copy
多用于修饰有可变类型的不可变对象上 NSString
,NSArray
,NSDictionary
上。block
(用strong
也可以)等。
-
__unsafe_unretain:
__unsafe_unretain
类似于 weak
,但是当对象被释放后,指针依然保存着之前的地址,被释放后的地址变为 僵尸对象,访问被释放的地址就会出问题,所以说他是不安全的。
-
__weak 和 __unsafe_unretain 的区别?
__unsafe_unretain
在指向的内存地址销毁后,指针本身并不会自动销毁,这也就造成了野指针,之后容易造成 Crash
。__weak
在指向的内存销毁后,可以将指针变量置为nil
,这样更加安全。
-
copy和strong的使用场景:
copy
多用于修饰有可变类型的不可变对象上 NSString
,NSArray
,NSDictionary
和block
等,原因:不论是用strong
还是copy
修饰的对象,其指针指向的地址依然还是原对象的地址,但一般我们想要一个不可变的,所以用copy
,而他们的可变类型为什么要用strong
修饰呢?如果原字符串是NSMutableString
的时候,使用strong
只会增加引用计数。但是copy
会执行一次深拷贝(self
语法会调用setter
方法,里面会执行一次copy
方法生成新的对象,指针和对象都不是原来的了),会造成不必要的内存浪费。
-
NSMutableArray可以用copy修饰吗?
不可以,因为对这个数组进行了增删改操作,而copy后的数组变成了不可变数组NSArray,没有响应的增删改方法,所以对其进行增删改操作就会报错。