ios中的对象类型分为三类:
实例对象:存放成员变量的具体指;
类对象:存放对象方法,属性,成员变量,协议信息等;
元类对象:存放类方法;
分类是利用runtime 动态将分类的方法合并到类对象,元类对象中,是在程序运行的时候进行合并的,创建的分类的对象方法会存储在类对象里,创建的类方法会存储在元类对象里。
生成的分类的C++结构如下:
image.png
由分类的结构可以看出,并没有存放成员变量的数组,所以分类是不能直接添加成员变量的。
分类中的方法整合到类对象或者元类对象的过程:
最初的指针指向类对象的方法列表,当给这个类添加分类后,会把最初的指针指向的方法列表往后移,然后把指向分类的指针对象放到最初的指针前面。
分类的加载处理过程
1,通过Runtime加载某各类所有的category数据
2,把所有category的方法,属性,协议数据合并到一个大数组中(最后参与编译的分类数据,会放在数组的前面)
3,将合并后的分类数据(方法,属性,协议)插入到类原来的数据的前面。
类扩展,相当于把写在m文件中的一些属性,成员变量的声明,方法的声明直接剪切到h文件中,在编译的时候就已经把属性,实例方法等放到类对象中,把类方法放到元类对象中了
网友评论