static Class realizeClassWithoutSwift(Class cls, Class previously)
{
runtimeLock.assertLocked();
class_rw_t *rw;
Class supercls;
Class metacls;
if (!cls) return nil;
if (cls->isRealized()) {
// 已经实现了的话,验证一下没问题就return
validateAlreadyRealizedClass(cls);
return cls;
}
ASSERT(cls == remapClass(cls));
// fixme verify class is not in an un-dlopened part of the shared cache?
auto ro = (const class_ro_t *)cls->data();
// 是否是元类
auto isMeta = ro->flags & RO_META;
if (ro->flags & RO_FUTURE) {
// TODO: 不太知道这个是啥意思
// This was a future class. rw data is already allocated.
rw = cls->data();
ro = cls->data()->ro();
ASSERT(!isMeta);
cls->changeInfo(RW_REALIZED|RW_REALIZING, RW_FUTURE);
} else {
// 一般Class。创建rw
// Normal class. Allocate writeable class data.
rw = objc::zalloc<class_rw_t>();
// 设置ro
rw->set_ro(ro);
// 设置标志位
rw->flags = RW_REALIZED|RW_REALIZING|isMeta;
// 设置rw
cls->setData(rw);
}
// 创建 cache
cls->cache.initializeToEmptyOrPreoptimizedInDisguise();
#if FAST_CACHE_META
if (isMeta) cls->cache.setBit(FAST_CACHE_META);
#endif
/**
选取在Class数组中的下标
有个全局变量 objc_indexed_classes_count会递增
全局数组用来保存Class Class objc_indexed_classes[1] = { nil };
放入 objc_indexed_classes 是在
*/
cls->chooseClassArrayIndex();
。。。
// 父类
supercls = realizeClassWithoutSwift(remapClass(cls->getSuperclass()), nil);
// 元类
metacls = realizeClassWithoutSwift(remapClass(cls->ISA()), nil);
#if SUPPORT_NONPOINTER_ISA
。。。
// SUPPORT_NONPOINTER_ISA
#endif
// Update superclass and metaclass in case of remapping
// 设置父类
cls->setSuperclass(supercls);
// 设置类的ISA为metaClass
cls->initClassIsa(metacls);
// Reconcile instance variable offsets / layout.
// This may reallocate class_ro_t, updating our ro variable.
/**
存在父类并且不是元类
调整成员变量偏移量/布局,可能会重新创建 ro,并更新成员变量
*/
if (supercls && !isMeta) reconcileInstanceVariables(cls, supercls, ro);
// Set fastInstanceSize if it wasn't set already.
cls->setInstanceSize(ro->instanceSize);
// Copy some flags from ro to rw
// 将一些标志位从ro复制到rw
if (ro->flags & RO_HAS_CXX_STRUCTORS) {
cls->setHasCxxDtor();
if (! (ro->flags & RO_HAS_CXX_DTOR_ONLY)) {
cls->setHasCxxCtor();
}
}
// Propagate the associated objects forbidden flag from ro or from
// the superclass.
if ((ro->flags & RO_FORBIDS_ASSOCIATED_OBJECTS) ||
(supercls && supercls->forbidsAssociatedObjects()))
{
rw->flags |= RW_FORBIDS_ASSOCIATED_OBJECTS;
}
// Connect this class to its superclass's subclass lists
if (supercls) {
// 如果存在父类,添加到其子类列表中
addSubclass(supercls, cls);
} else {
/**
设置根类:全局变量 _firstRealizedClass
***********************************************************************
* _firstRealizedClass
* The root of all realized classes
**********************************************************************
static Class _firstRealizedClass = nil;
*/
addRootClass(cls);
}
// Attach categories
/***********************************************************************
添加分类
* Fixes up cls's method list, protocol list, and property list.
**********************************************************************/
methodizeClass(cls, previously);
return cls;
}