Category 使用场合
将类的实现分散到多个不同文件或多个不同框架中(为已有的类扩充新的方法)
创建对私有方法的前向引用
可以向对象添加非正式协议
Category 实现原理
Category 编译之后的底层结构是stuct category_t 里面存储着分类的对象方法,类方法,属性,协议信息。
在程序运行的时候,runtime会将category的数据,合并到类的信息中(类对象,元类对象中)
类别(Category)和 类扩展(Extension)的区别:
Class Extension 在编译的时候,它将数据就已经包含在类信息中
Category是运行时,才将数据就已经包含在类信息中
Category中有load方法嘛?load方法时什么时候调用的?load方法能继承吗?
有load方法
load方法会在程序运行时加载类,分类的调用 。没个类,分类的+load方法在程序运行过程中只调用一次
方法调用顺序
1.先调用类(没有父类的情况)的load(多个类 按编译顺序 先编译在调用) 如果有子类再调用子类的load方法(之前先调用父类的load方法)
2.再调用分类的load(按编译顺序 先编译在调用)
如果类和分类都有同样的方法 先调用分类的方法(因为分类的同名方法后放进方法列表中,所以在最上面,再调用的时候会先取最上面的分类方法),如果多个分类都有同名方法,会根据程序的编译顺序调用,会调用最后面编译的分类里的方法。
+initialize 方法
+initialize 方法 会在类第一次接受消息的时候跳用
调用顺序
先调用父类的+initialize 方法 再调用子类的+initialize 方法
+initialize 方法 和+load方法 最大的区别是 ?
+load 根据函数地址直接调用的
+initialize是通过objc_msgSend进行调用的 所有会有以下特点
1.如果子类没有实现 +initialize 方法,会调用父类的 +initialize( 父类+initialize 可能会被多次调用)
2。如果分类实现了 +initialize 就会覆盖类本身的 +initialize 调用