面试中解释下类别,原理

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的私有方法公开化

你可能感兴趣的:(面试中解释下类别,原理)