依赖runtime 动态的将分类的方法和类方法合并到类对象和元类对象的方法列表中 (对实例对象 类对象 元类对象和isa要有认识)
编译阶段
编译完毕之后 分类 变成_categoty_t结构体 方法暂时是在这个结构体里面 这个结构体里面有方法列表 协议列表等等 这个时候还没有合并到原来的类中去
源码截的图 转成cpp文件和这个基本一样.png
runtime阶段
在runtime调用runtime的初始化函数之后 会把分类的方法插入到原来的方法列表的前面 所以分类和原来的类同一个方法的话会实现分类的 如果两个分类都有的话 看编译顺序 越后编译方法越前
image.png
说一下 被问到过的面试题
category的原理
category编译之后的底层数据结构是category_t 里面存储着对象方法 类方法 属性 协议信息
在运行的时候 runtime会将category的数据合并到类对象(或者元类对象)中
Extension和Category的区别
类拓展是编译的时候就已经合并到类里面了 分类是运行时的时候合并的
网友评论