《编写高质量iOS与OS X代码的52个有效方法》读书笔记(2)

第2章

6.理解“属性”这一概念

属性最终还是得通过实例变量来实现
(1)使用@property语法,OC就可以根据名称自动创建出存取方法。

  • 使用属性的话,编译器会自动编写访问这些属性所需的方法,此过程叫做“自动合成”。
  • 除了生成方法外,编译器还自动向类中添加适当类型的实例变量,并且在属性名前加下划线,以此作为实例变量名。(@synthesize语法可以为属性指定实例变量的名字)
  • 使用@dynamic关键字,它会告诉编译器:不要自动创建实现属相所用的实例变量,也不为其创建存取方法。

(2)属性特质

  • 原子性:如果属性不具备nonatomic特质,那他就是原子的(atomic)。
  • 读/写权限:1.readwrite(读写)2.readonly(只读)。
  • 内存管理语义

1.assign “设置方法”只会执行针对“纯量类型”(CGFloat,NSInteger等)的简单赋值操作。
2.strong 此特质表明该属性定义了一种“拥有关系”。为属性设置新值时,设置方法会先保留新值,并释放旧值,然后再将新值设置上去。
3.weak 此特质表明该属性定义了一种“非拥有关系”。为属性设置新值时,设置方法既不保留新值,也不并释放旧值。此特质与assign类似,在属性所指的对象遭到摧毁时,属性值会被置为nil。
4.unsafe_unretained 此特质的语义与assign相同,但它适用于“对象类型”,该特质表达一种“非拥有关系”(“不保留”,unreatined),当目标对象被销毁时,属性值不会自动情空,这与weak不同。
5.copy 此特质所表达的所属关系与strong类似。设置方法并不保留心智,而是将其“拷贝”。当属性类型为NSString*时,经常用此特质保护其封装性。

  • 方法名:1.getter= 指定“获取方法”的方法名。2.setter= 指定“设置方法”的方法名。

7.在对象内部尽量直接访问实例变量

在读取实例变量的时候采用直接访问的形式,而在设置实例变量的时候通过属性来做。

(1)两种写法的区别

  • 直接访问实例变量不经过OC的“方法派发”,速度较快。
  • 直接访问实例变量是,不会调用其setter方法,这就绕过了相关属性所定义的内存管理语义。例如:在ARC下直接访问一个声明为copy的属性,并不会拷贝属性,只会保留新值并释放旧值(相当于strong)。
  • 直接访问实例变量,不会触发“键值观察”(KVO)通知。
    在写入实例变量时,通过其setter来做,而在读取实例变量时,则直接访问
    注意:当使用“懒加载”的时候,必须通过“获取方法”来访问属性,否则实例变量永远不会初始化。
    在初始化方法及dealloc方法中,总是应该直接通过实例变量来读写数据

你可能感兴趣的:(《编写高质量iOS与OS X代码的52个有效方法》读书笔记(2))