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

流程图

搭配源码及注释食用更加

iOS底层-类的实现

1.1 实现OC类

1.2 实现Swift类

  • 注意点

    • Metaclasses never have a Swift initializer.

    • Root classes never have a Swift initializer.

    • (These two together avoid initialization order problems at the root.)

      • 这两条避免了初始化的顺序错乱的问题

    • 没有initializer的Swift类也不存在拥有initializer的父类

      • realizeClassWithoutSwift()内无须扫描父类

二、初始化类:initializeAndLeaveLocked

相比Realize的流程,初始化的流程相对简单。我画了个流程图。

iOS底层-类的初始化

三、总结

  • Realize

    • 主要完成类的基础结构的搭建

      • ISA链继承链rwro

  • Initialize

    • 找到非元类的Class

    • 标志位处理

    • +initialize方法调用

Last updated

Was this helpful?