十五、类的加载

2020-10-26  本文已影响0人  KB_MORE

十四、dyld和objc的关联 中我们从APP启动dyld讲到objc_init,然后是map_images,继而map_images_nolock最后到了_read_images
_read_images中对类进行了一系列的处理
关于类的信息:

1.条件控制进⾏⼀次的加载
2.修复预编译阶段的 @selector 的混乱问题
3.错误混乱的类处理
4.修复重映射⼀些没有被镜像⽂件加载进来的 类
5.修复⼀些消息!
6.当我们类⾥⾯有协议的时候 : readProtocol
7.修复没有被加载的协议
8.分类处理
9.类的加载处理
10.没有被处理的类 优化那些被侵犯的类

在_read_images中我们主要看类是怎么加载的, 因为系统中有好多类, 我们只需要观察我们自己的类就可以了

    // Realize non-lazy classes (for +load methods and static instances) -  懒加载类 -> 非懒加载类
    // 懒 别人不懂我 我就不动 - 让它 提前加载 - load_images 类
    // 懒加载类在什么时候? 
    for (EACH_HEADER) {
        classref_t const *classlist = 
            _getObjc2NonlazyClassList(hi, &count);
        for (i = 0; i < count; i++) {
            Class cls = remapClass(classlist[i]);
            
            const char *mangledName  = cls->mangledName();
            const char *LGPersonName = "LGPerson";
            if (strcmp(mangledName, LGPersonName) == 0) {//这部分是代码是为了只观察我们自己的类
                auto kc_ro = (const class_ro_t *)cls->data();
                printf("_getObjc2NonlazyClassList: 这个是我要研究的 %s \n",LGPersonName);
            }
            
            if (!cls) continue;

            addClassTableEntry(cls);

            if (cls->isSwiftStable()) {
                if (cls->swiftMetadataInitializer()) {
                    _objc_fatal("Swift class %s with a metadata initializer "
                                "is not allowed to be non-lazy",
                                cls->nameForLogging());
                }
                // fixme also disallow relocatable classes
                // We can't disallow all Swift classes because of
                // classes like Swift.__EmptyArrayStorage
            }  // alloc init - 类存在 完备 实例
            realizeClassWithoutSwift(cls, nil);
        }
    }

// Realize non-lazy classes (for +load methods and static instances)这行注释的意思就是初始化非懒加载的类, 那么什么是非懒加载类呢?

实现了load方法静态实例

要观察我们自己创建的类是怎么加载到的呢,就要进行断点调试
项目中已经添加了LGPerson类


LGPerson
LGPerson.m

断点调试发现这里的代码就是进不来


图片.png

为什么呢?
我们在LGPerson中添加load方法, 再次调试就进来了这就对应了上面的注释, 实现了load方法就是非懒加载的类

上一篇 下一篇

猜你喜欢

热点阅读