Category 实现原理

2019-08-12  本文已影响0人  南城同學
Category的原理

无论你创建了多少个分类,分类中有多少对象方法或类方法,程序运行时, 通过runtime动态将分类


Category的底层结构:

1、当程序编译的时候,Category都会变成如下结构体:

struct _category_t {
    const char *name;
    struct _class_t *cls;
    const struct _method_list_t *instance_methods;
    const struct _method_list_t *class_methods;
    const struct _protocol_list_t *protocols;
    const struct _prop_list_t *properties;
};

2、源码

struct category_t {
    const char *name;
    classref_t cls;
    struct method_list_t *instanceMethods;
    struct method_list_t *classMethods;
    struct protocol_list_t *protocols;
    struct property_list_t *instanceProperties;
    // Fields below this point are not always present on disk.
    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);
};

Category的加载处理过程:
  1. 通过Runtime加载某个类的所有Category数据;

  2. 把所有Category方法属性协议数据,合并到一个大数组中,(后面参与编译的Category数据,会在数组的前面)。

  3. 将合并后的分类数据(方法属性协议),插入到类原来数据的前面

所以,如果Category中重写了类中的方法,那该方法的调用顺序 ?
原理:

⚠️:分类和类中的+load方法都会调用


Category(分类)和Extension(类扩展)的区别:

Category可以添加成员变量吗 ?

如何实现给分类添加"成员变量"?
上一篇下一篇

猜你喜欢

热点阅读