类的加载
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