11期_iOS-分类探究
2023-08-11 本文已影响0人
萧修
分类概念
分类的特点:
- 编译后的Category类,是没有将方法添加到宿主类的,是通过程序运行时依赖runtime动态添加到宿主类
- 分类是给原有类添加方法,在分类的结构体指针中,是没有属性列表,只有方法列表
- 分类可以写
property
,但是不会生成setter方法,也不会生成私有变量,会编译通过,引用报错 - 分类中方法和原类方法冲突,会优先调用分类方法(分类的方法是最好添加到方法列表中)
- 多个分类方法,由编译顺序决定,谁最后编译执行谁
多个分类编译顺序(队列方式):Build Phases -> Compil Sources 列表中下面的Category文件比其上边的Category文件先加载运行
分类中的instance方法合并到class对象中,类方法合并到meta-class对象中
属性、instance方法、协议合并到类对象struct class_rw_t中
通过attachCategories函数将合并后的分类数据(方法、属性、协议),插入到类原来数据的前面
initialize和load区别
load是启动加载时刻runtime调用,
1、调用顺序:load是函数地址调用,initialize是objc_msgsend调用;都是系统主动调用
2、分类加载load方法,原类也会加载,先编译优先加载(只加载一次)。而initialize子类调用 再调用父类,父类会调用多次
分类的底层结构
struct category_t{
const char *name;//分类名称
classref_t cls;//所属原类
struct method_list_t *instanceMethods;//实例方法列表
struct method_list_t *classMethods;//类方法列表
struct property_list_t *protocols;//协议方法列表
struct property_list_t *instanceProperties;//实例属性列表
}