前言
这篇是关于懒加载类与非懒加载类加载过程的分析。这里的区分条件主要为+load方法,实现了+load方法的类为非懒加载类,反之,则为懒加载类。
一、非懒加载类加载
在上一篇中简单介绍了在_read_images方法中非懒加载类的实现
for (EACH_HEADER) {
//从非懒加载类段读取懒加载类列表
classref_t const *classlist =
_getObjc2NonlazyClassList(hi, &count);
for (i = 0; i < count; i++) {
Class cls = remapClass(classlist[i]);
if (!cls) continue;
//把类和元类添加到包含用objc_allocateClassPair分配的所有类(和元类)的allocatedClasses表中。
addClassTableEntry(cls);
......
//OC实现类
realizeClassWithoutSwift(cls, nil);
}
}
1.1 realizeClassWithoutSwift方法源码
static Class realizeClassWithoutSwift(Class cls, Class previously)
{
......
if (!cls) return nil;
if (cls->isRealized()) return cls;
ASSERT(cls == remapClass(cls));
//类的data数据刚开始就是class_ro_t
auto ro = (const class_ro_t *)cls->data();
auto isMeta = ro->flags & RO_META;
//从下面if-else推断将来的类就是rw已分配的但没初始化的类?
if (ro->flags & RO_FUTURE) {
//将来的类, rw data已经分配了。
rw = cls->data();
ro = cls->data()->ro();
ASSERT(!isMeta);
cls->changeInfo(RW_REALIZED|RW_REALIZING, RW_FUTURE);
} else {
// 正常类,分配rw数据。
rw = objc::zalloc<class