重学OC第十二篇:类的加载(中)

文章目录
摘要由CSDN通过智能技术生成

前言

这篇是关于懒加载类与非懒加载类加载过程的分析。这里的区分条件主要为+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
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值