温习 《 Effective Objective-C》,关键字 @dynamic

好有道理啊

第二章 , 对象、消息、运行时, 的第 6 条: 理解属性


@synthesize

使用属性,编译器就会自动编写访问这些属性所需的方法, 这就是“自动合成” ( auto synthesis )

这个过程,由编译器在编译期执行,所以编译器里看不到这些“合成方法”的源代码
synthesized method

也可以在类的实现代码中,通过 @synthesize 语法,来指定实例变量的名字。

通过这个方法, 将实例变量的名字改为自己想要的名字。



@dynamic

他会告诉编译器, 不要自动创建实现属性所用的实例变量,也不要为其创建存取方法。

在编译访问属性的代码时,即使编译器发现,没有定义存取方法, 也不会报错,编译器认为这些方法能在运行时找到。

一个挺经典的例子:
如果从 CoreData 框架中的 NSManagedObject 类里继承了一个子类,那么就需要在运行时动态创建存取方法。
一定要继承 NSManagedObject 类的一个子类,使用 @dynamic 关键字,原因是子类的属性不是实例变量,其数据来自本地的数据库。


( 传说中的爱飞翔,说 其数据来自后端的数据库, 真的呵 )


NSManagedObject opts for this approach because the properties are not instance variables. The data comes from whatever database back end is being used.


传说中的爱飞翔, 看起来是根据原文直接翻译的。
感觉不好。


直接用 Core Data 写个本地应用,当然是可以的。



属性的关键字, 4 种类型

  • 原子性,和非原子性
    atonic , nonatomic
  • 读 / 写权限
    读写 readwrite
    只读 readonly
  • 内存管理语义

    • assign , 纯量关系

    • strong , 拥有关系。
      设置操作处理

    • weak , 非拥有关系
      属性所指向的对象释放时,属性值也会自动清空。
      nil out

    • unsafe_unretained, 非拥有关系
      属性所指向的对象释放时,属性值不会自动清空。

    • copy

  • 方法名

getter / setter

tea time

你可能感兴趣的:(温习 《 Effective Objective-C》,关键字 @dynamic)