十五、类的加载
2020-10-26 本文已影响0人
KB_MORE
十四、dyld和objc的关联 中我们从APP启动
到dyld
讲到objc_init
,然后是map_images
,继而map_images_nolock
最后到了_read_images
_read_images中对类进行了一系列的处理
关于类的信息:
1.条件控制进⾏⼀次的加载
2.修复预编译阶段的 @selector 的混乱问题
3.错误混乱的类处理
4.修复重映射⼀些没有被镜像⽂件加载进来的 类
5.修复⼀些消息!
6.当我们类⾥⾯有协议的时候 : readProtocol
7.修复没有被加载的协议
8.分类处理
9.类的加载处理
10.没有被处理的类 优化那些被侵犯的类
在_read_images中我们主要看类是怎么加载的, 因为系统中有好多类, 我们只需要观察我们自己的类就可以了
// Realize non-lazy classes (for +load methods and static instances) - 懒加载类 -> 非懒加载类
// 懒 别人不懂我 我就不动 - 让它 提前加载 - load_images 类
// 懒加载类在什么时候?
for (EACH_HEADER) {
classref_t const *classlist =
_getObjc2NonlazyClassList(hi, &count);
for (i = 0; i < count; i++) {
Class cls = remapClass(classlist[i]);
const char *mangledName = cls->mangledName();
const char *LGPersonName = "LGPerson";
if (strcmp(mangledName, LGPersonName) == 0) {//这部分是代码是为了只观察我们自己的类
auto kc_ro = (const class_ro_t *)cls->data();
printf("_getObjc2NonlazyClassList: 这个是我要研究的 %s \n",LGPersonName);
}
if (!cls) continue;
addClassTableEntry(cls);
if (cls->isSwiftStable()) {
if (cls->swiftMetadataInitializer()) {
_objc_fatal("Swift class %s with a metadata initializer "
"is not allowed to be non-lazy",
cls->nameForLogging());
}
// fixme also disallow relocatable classes
// We can't disallow all Swift classes because of
// classes like Swift.__EmptyArrayStorage
} // alloc init - 类存在 完备 实例
realizeClassWithoutSwift(cls, nil);
}
}
// Realize non-lazy classes (for +load methods and static instances)
这行注释的意思就是初始化非懒加载的类, 那么什么是非懒加载类呢?
实现了
load方法
和静态实例
要观察我们自己创建的类是怎么加载到的呢,就要进行断点调试
项目中已经添加了LGPerson类
LGPerson
LGPerson.m
断点调试发现这里的代码就是进不来
图片.png
为什么呢?
我们在LGPerson中添加load方法, 再次调试就进来了这就对应了上面的注释, 实现了load方法就是非懒加载的类