Category

251 阅读1分钟

1:分类的方法都会通过运行时合并到类对象中(+方法一样合并到元类对象)

2:分类在编译的时候变成了_category_t的结构体,存储着类名,类对象,实例方法列表,类方法列表,协议列表,属性列表。

3:分类合并注意点:最后面参与编译的方法优先放在前面,若分类和类都有相同的方法,分类优先。

4:OCextenstion 是在编译的时候就将属性信息,成员信息等合并到类对象中。

5:load方法在 runtime加载类或者分类的时候调用,只调用一次

6:先调用类的load方法,load按编译顺序调用,若有父类,先调用父类的 load,之后再调用分类的load方法,按编译顺序调用。

7:load直接通过函数地址进行调用,而其他方法通过 objc_msgSend 进行调用

8: initialize在类第一次接收消息的时查找方法的过程中调用,在调用子类的initialize之前会先调用父类的initialize,这一点和 load一样

9:分类实现了initialize就覆盖主类的initialize

10:在分类里写属性,只会生成 gettersetter 的方法声明,不会生成成员变量

11:关联对象原理:disguised_ptr_t是传进来的实例对象或类对象进行 DESGUISE位运算得到的,AssociationsMap内的 key就是传进来的key

12:设置关联对象为 nil,可以移除关联对象