12.类的实现与初始化源码解读
前言
在上一文中runtime-objc_msgSend中我们有遇到这样一个重要的流程
cls = realizeAndInitializeIfNeeded_locked(inst, cls, behavior & LOOKUP_INITIALIZE);本文就将对类的实现与初始化,结合源码作深入探究。
/***********************************************************************
* realizeAndInitializeIfNeeded_locked
如果类未实现就实现,如果未初始化就初始化
inst:是cls或者其子类的一个实例对象,或者nil
cls:需要初始化或者实现的类
initialize:true会初始化class,false跳过初始化
**********************************************************************/
static Class
realizeAndInitializeIfNeeded_locked(id inst, Class cls, bool initialize)
{
runtimeLock.assertLocked();
if (slowpath(!cls->isRealized())) {
cls = realizeClassMaybeSwiftAndLeaveLocked(cls, runtimeLock);
}
if (slowpath(initialize && !cls->isInitialized())) {
cls = initializeAndLeaveLocked(cls, inst, runtimeLock);
}
return cls;
}本文基于
objc4-818.2源码
一、实现初始化的区别
这里你肯定和我一样有疑问:
初始化我大概知道是啥,实现是个什么鬼?有什么区别?
1.1 isRealized()
实际是判断当前类的class_rw_t *data()是否存在,及是否有标志位RW_REALIZED
1.2 isInitialized()
实际是判断metaClass的class_rw_t *data()是否存在,及是否有标志位RW_INITIALIZED
一、实现类:realizeClassMaybeSwiftAndLeaveLocked
流程图
搭配源码及注释食用更加

1.1 实现OC类
1.2 实现Swift类
注意点
Metaclassesnever have aSwift initializer.Root classesnever have aSwift initializer.(These two together avoid initialization order problems at the root.)
这两条避免了初始化的顺序错乱的问题
没有
initializer的Swift类也不存在拥有initializer的父类在
realizeClassWithoutSwift()内无须扫描父类
二、初始化类:initializeAndLeaveLocked
相比Realize的流程,初始化的流程相对简单。我画了个流程图。

三、总结
Realize
主要完成类的基础结构的搭建
如
ISA链和继承链,rw,ro
Initialize
找到
非元类的Class标志位处理+initialize方法调用
Last updated
Was this helpful?