原理
- 通过runtime动态将分类的方法合并到类对象,元类对象中。
底层加载
查看objc-os.mm文件(查看运行时的文件入口)
- void objc_init(void) 运行时初始化
- _read_images() 加载镜像/模块
- 通过for(EACH_HEADER) 搜索分类
- 传入cls(类)、meta-cls(元类)到remethodizeClass
- 调用attachCategories,通过while(i--)循环,遍历所有category,分别合并method、protocol、property到数组中。
- rw将合并category的数组,通过attachList函数,分别对应传入method、protocol、property
- attachList 中扩充类的对应属性后,也会重新分配所需内存。
底层结构
-
所有分类的结构都一样。
-
本质上category也是结构体(_category_t),包含:协议、属性等信息。编译完成,仅生成_category_t类型的结构体。
-
最后加载的分类最先合并到类对象。
-
分类创建的成员变量,要利用runtime实现set和get,runtime调用get,底层会判断策略和值,返回值。
网友评论