类的加载

2022-08-22  本文已影响0人  ios小喽喽

objc_init:

exception_init():读取影响运行时的环境变量

tls_init():线程key的绑定

static_init():运行C++静态构造函数,在dyld调用静态构造函数之前,‘linbc’会调用_objcinit()

exception_init():初始化libobjc的异常处理系统

runtime_init():runtime运行时环境初始化,主要是:unattachedCategories,allocatedClasses

图(1)

cache_init():缓存条件初始化

_imp_implementationWithBlock_init():启动回调机制

图(2)

_dyld_objc_notify_register(&map_images, load_images, unmap_image):

map_images(映射镜像文件):1、条件控制进行一次加载,2、修复预编译阶段的‘@selector’的混乱问题,3、错误混乱的类处理,4、修复重映射一些没有被镜像文件加载的类,5、修复一些消息,6、当我们类里面有协议的时候:readProtocol,7修复没有被加载的协议,8、分类处理,9、类的加载处理,10、没有被处理的类优化那些被侵犯的类

图(3)

load_images 分析:

图(4)

懒加载类 :

1、lookUpImpOrForward 2、realizeClassMaybeSwiftMaybeRelock 3、realizeClassWithoutSwift  4、methodizeClass

非懒加载类:

1、readClass 2、_getObjc2NonlazyClassList  3、realizeClassWithoutSwift  4、methodizeClass

类和分类搭配加载:

图(5)

attachCategories:

图(6)

类扩展VS分类:

1:category:类别,分类

        a、专门用来给类添加新的方法,b、不能给类添加成员属性,c、可以通过runtime添加属性属性,d、分类中用@property定义变量,只会生成getter,setter方法的声明,不能生产方法的实现和带下划线的成员变量

2:extension:类扩展

        a、可以说成是特殊的分类,也称作匿名分类

        b、可以给类添加成员属性,但是是私有变量

        c、可以给类添加方法,也是私有方法

关联对象:设值流程

1:创建一个AssociationsManager管理类

2:获取唯一的全局静态哈希Map

3:判断是否插入的关联值是否存在:a、存在走第四步,b、不存在就走 :关联对象插入空流程

4:创建一个空的objectAssociationMap去查询的键值对

5:如果没有这个key就插入一个空的BucketT进去 返回

6:标记对象存在关联对象

7:用当前修饰策略和值组成一个ObjcAssociation替换原来BucketT中的空

8:标记一下ObjectAssociationMap的第一次为false

图(7)

关联对象插入空流程

1、根据DisguisedPtr找到AssociationsHashMap中的迭代查询器

2、清理迭代查询器

3、其实如果插入空置相当于清除

关联对象:取值流程

1、创建一个AssociationsManager管理类

2、获取唯一的全局静态哈希Map

3、根据DisguisedPtr找到AssociationsHashMap中的iterator迭代查询器

4、如果这个迭代查询器不是最后一个获取:ObjectAssociationMap(这里有策略和value)

5、找到ObjectAssociationMap的迭代查询器获取一个经过属性修饰的value

6、返回——_value

上一篇下一篇

猜你喜欢

热点阅读