1.属性
- 属性时OC的一项特性,用于封装对象中的数据
- @property基于严格的命名规范
- 优点:
-
- 使用点语法和存取方法效果相同
-
- 使用属性,编译器会自动编写访问这些属性所需的方法,该过程由编译器在编译器执行
- 禁止编译器自动合成存取方法
-
- 自己实现存取方法
- 使用@dynamic关键字,该关键字会告诉编译器:
-
- 不要自动创建实现属性所用的实例变量
- 不要为其创建存取方法。编译器确定运行期一定能找到这些方法
2.属性特质(关键字)
- 特制的设定会影响编译器所生成的存取方法
- 特质分类
-
- 原子性:默认情况下,邮编一起所合成的方法会通过锁定机制确保其原子属性
-
- nonatomic:非原子的,不使用同步锁
- atomick:原子的,使用同步锁
- 读写权限:
-
- readwrite:可读写,属性拥有getter/setter方法
- readonly:只读,属性只由获取方法
- 内存管理语义:所有权语义
-
- assign:其设置方法只会执行针对“纯量类型”的简单赋值操作
- strong:“拥有关系”,其设置方法先保留新值,并释放旧值,然后再将新值设置上去
- weak:“非拥有关系”,类似于assign,但在属性所知的对象遭到销毁时,属性值也会清空(=nil)
- unsafe_unretained:跟assign相同,但它适用于“对象类型”,对象销毁时没有赋空操作
- copy:所属关系与strong类似,然而设置方法并不保留新值,而是将其copy。经常用此特质保护其封装性
- 方法名:
-
- getter=<name>:指定“获取方法”的方法名
- setter=<name>:指定“设置方法”的方法名
- 注意:所有的属性都声明为nonatomic,因为在iOS中使用同步锁的开销很大,这会带来性能问题,atomic并不能保证线程安全。
要点
- 可以用@property语法来定义对象中所封装的数据
- 通过“特质”来指定存储数据所需要的正确语义
- 在设置属性所对应的实例变量时,一定要遵从该属性所声明的语义