新手篇
1、与多线程相关的参数
atomic
:默认值、安全、效率低下
nonatomic
:不安全但是效率高
无论在MRC还是ARC都可以使用。使用建议无论是在ARC还是MRC下都建议使用nonatomic
。
2、retain
:
只能在MRC模式下使用,代表生存的setter的代码都是标准的内存管理代码。使用建议:当属性值是OC对象时,绝大多数使用retain。只有出现了循环引用的使用一边使用retain
、一边使用assign
。
3、assign
在ARC和MRC下都可以使用assign
。当属性值是非OC对象的时候使用assign
。
4、strong
只能在ARC下使用,当属性类型是OC对象时,绝大多数使用strong
。只有在出现了循环引用的时候一边使用strong
一边使用week
。
5、week
只能在ARC下使用,当属性的类型是OC对象的时候。只有出现了循环引用。一边使用week
一边使用strong
。
6、readonly
、readwrite
只读、可读可写。无论ARC和MRC都可使用。
7、setter
、getter
无论ARC和MRC下都可以使用。
进阶篇
原子性
atomic、nonatomic
读写权限
readwrite、readonly、setter、getter
内存管理
assign、weak、unsafe_unretained、retain、strong、copy
原子性
属性关键字 | 用法 |
---|---|
atomic | 原子性(默认),编译器会自动生成互斥锁,对 setter 和 getter 方法进行加锁,可以保证属性的赋值和取值的原子性操作是线程安全的,但不包括操作和访问。 |
nonatomic | 非原子性,一般属性都用 nonatomic 进行修饰,因为 atomic 效率低。 |
读写权限
属性关键字 | 用法 |
---|---|
readwrite | 可读可写(默认),同时生成 setter 方法和 getter 方法的声明和实现。 |
readonly | 只读,只生成 getter 方法的声明和实现。 |
setter | 可以指定生成的 setter 方法名 |
getter | 可以指定生成的 getter 方法名 |
内存管理
属性关键字 | 用法 |
---|---|
assign | 1. 既可以修饰基本数据类型,也可以修饰对象类型;2. setter 方法的实现是直接赋值,一般用于基本数据类型(修饰对象类型时,不增加其引用计数;) ;3. 修饰基本数据类型,如 NSInteger、BOOL、int、float 等; |
weak | 1. 只能修饰对象类型;2. ARC 下才能使用;3. 修饰弱引用,不增加对象引用计数,主要可以用于避免循环引用; |
retain | 1. MRC 下使用,ARC 下基本使用 strong; setter 方法的实现是 release 旧值,retain 新值,用于OC对象类型。(见下文) |
strong | 1. ARC 下才能使用;2. 原理同 retain; |
copy | 1. setter 方法的实现是 release 旧值,copy 新值,用于 NSString、block 等类型; (见下文) |
retain
- (void)setName:(NSString *)name
{
if (_name != name) {//说明新旧对象不是同一个对象
[_name release];//release旧的
_name = [name retain];//retain新的
}
}
copy
- (void)setName:(NSString *)name
{
if (_name != name) {
[_name release];
_name = [name copy];
}
}