06.Objective-C 分类(Categroy)的底层结构

2021-01-11  本文已影响0人  ProfessorFan

问题

  1. Category 的底层结构
  2. 分类的加载处理过程
  3. 分类中load方法加载过程
  4. initialize方法的调用过程,准遵循原理
  5. initialize 方法 和 load 方法区别

答案

  1. Category 的底层结构
# 通过 
xcrun -sdk iphoneos clang -arch arm64 -rewrite-objc MJPerson+Test1.m -o MJPerson+Test1_arm64.cpp
得到了 category_t 分类的底层结构
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;
};

# 通过 objc 源码  objc-runtime-new.h 文件中分类结构体的定义
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);
    
    protocol_list_t *protocolsForMeta(bool isMeta) {
        if (isMeta) return nullptr;
        else return protocols;
    }
};
  1. 分类的加载处理过程
    分类函数加载到内存当中如下图:


    分类函数加载图.png
  1. 分类中load方法加载过程
  1. initialize方法的调用过程,准遵循原理
  1. initialize 方法 和 load 方法区别:
上一篇 下一篇

猜你喜欢

热点阅读