加载区别
实现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);
};