(杂记)iOS底层:分类与类的关于是否实现load方法的加载区别

254 阅读1分钟

加载区别

实现load 方法的时候

1:懒加载的类 + 非懒加载的分类 - 类似 - 子类实现了 - 父类 伴随这一实现

发送消息的时候就去读取 - realizeClassWithoutSwift - methodlizeClass

就是我的类要在消息发送的时候才有 - 但是我的分类提前了 - 需要加载 - read_images - addUnattachedCategoryForClass - 但是没有实现类 就会在下面 prepare_load_methods 实现

prepare_load_methods - realizeClassWithoutSwift 给你提前了实现类的信息 - unattachedCategoriesForClass

2:非懒加载的类 + 非懒加载的分类

read_images - realizeClassWithoutSwift - methodlizeClass - addUnattachedCategoryForClass - 判断是否实现 - 这里看到上面一行就在read_images 实现了

// if (cls->isRealized()) {
//   remethodizeClass(cls); -> 实现类信息
//}

attachCategories 加载分类数据进来

cls->demangledName() 用这个 不要用name

addUnattachedCategoryForClass(cat, cls, hi);
const char *cname = cls->demangledName();
const char *oname = "LGTeacher";
if (cname && (strcmp(cname, oname) == 0)) {
   printf("_getObjc2CategoryList :%s \n",cname);
}

if (cls->isRealized()) {
    remethodizeClass(cls);
    classExists = YES;
}

分类没有实现 load - 的分类 - 编译处理 - 直接处理 data() - ro

3:非懒加载的类 + 懒加载的分类

read_images - realizeClassWithoutSwift - methodlizeClass - 不需要添加表 - 直接在相应data() - ro

4:懒加载的类 + 懒加载的分类

消息发送的时候 - lookuporforward - realizeClassWithoutSwift - methodlizeClass

addUnattachedCategoryForClass 不进来 - 直接走data()

分类的懒加载 - 要不要运行时去处理 -

懒加载的 - 编译时就确定

非懒加载的 - 运行时确定

和类的懒加载有一丢丢不一样!!!!!!

分类的数据结构

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);
};