1、分类的定义
struct category_t {
const char *name;
classref_t cls;
struct method_list_t *instanceMethods;
struct method_list_t *classMethods;
struct property_list_t *instaceProperties;
struct property_list_t *_classProperties;
method_list_t *methodsForMeta(bool isMeta){
if(isMeta) return classMethods;
else return instanceMethods;
}
property_list_t *propertiesForMeta(bool isMeta,struct header_info *hi);
}
分类的本质是一个结构体,存储类的实例方法、类方法、协议、实例属性、类属性。
2、分类的特点和作用
分类的特点
1、分类是在运行时决议
2、可以为系统类添加分类
3、分类可以添加实例方法、类方法、协议、属性。添加属性时只声明set、get方法,没有对应的实现,不会添加成员变量。
扩展的特点
1、扩展在编译时决议
2、不可以为系统类添加扩展,因为编译的时候已经决定了。
3、扩展可以声明属性、方法。
分类中+load 和 +initialize区别
1、load的调用时机:是runtime的加载类,在程序启动装载类信息的时候调用,通过函数地址直接调用,每个load都会调用且仅调用一次。
2、load方法的调用顺序和方式:父类>子类>分类;类中的load优先于分类中的。每个分类中和原类中的load方法都会被调用,不会互相覆盖。
3、initialize调用时机:是通过objc_msgSend调用的,只有每个类在第一次初始化的时候调用一次,如果子类中没有实现initialize会去调用父类的initialize方法。分类中的initialize会覆盖原类的实现。
4、initialize调用顺序:在某个类第一次初始化时,会先强制为初始化过的父类调用initialize,然后本类再调用initialize。
分类的其他特点
1、分类添加的方法会覆盖原类的方法,同名分类方法谁能生效取决于编译顺序。
2、可以使用关联对象的计数模拟为分类添加成员变量。
分类的作用
1、声明私有方法
2、分解体积庞大的类文件
3、把framework的私有方法公开化