Category

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 调用

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容