@property 特性分为三类:原子性、存取器控制、内存管理。
原子性
- atomic 指定属性的原子操作是线程安全的,类似锁,只有一个线程访问实例变量,默认限定符,可缺省。
- nonatomic 指定属性的原子操作是线程不安全的,可提高访问速度,非多线程时访问数据时建议使用。
存取器控制
- readwrite 指定属性可读可写,默认限定符,可以省略不写。
- readonly 指定属性只读,没有 setter 方法。
有时候为了语意更明确,可以自定义访问器的名字,如
@property (nonatomic, setter=changeName:, getter=fullName) NSString *name;
//应用:
[self changeName:@"jack"];
NSLog(@"%@",[self fullName]);//打印:jack
最常见的是运用于 Bool 类型,如下声明一个隐藏属性:
@property (nonatomic,getter = isHidden ) BOOL hidden;
内存管理
- strong 强引用关系,即拥有对象的所有权,对象的 returnCount + 1,默认限定符,可缺省。
- weak 弱引用关系,即对引用的对象没有所有权,当引用计数为零时,也就是对象释放后,weak 修饰的变量置为 nil。
- copy 与 strong 类似,区别是对传入对象的副本拥有所有权,非对象本身。
- assign 表示直接赋值,主要用于基本数据类型,如 int等。也包括不存在所有权关系的对象,如 delegate。