文章目录分类的目的底层结构加载过程分类的目的我们为什么会用到分类呢,我觉得有以下原因为了让不同功能模块化分别写在不同文件中,便于管理和后期修改与维护减少单个文件的代码量这就可以让不同开发者共同完成一...

文章目录
- 分类的目的
- 底层结构
- 加载过程
分类的目的
我们为什么会用到分类呢,我觉得有以下原因
- 为了让不同功能模块化分别写在不同文件中,便于管理和后期修改与维护
- 减少单个文件的代码量
- 这就可以让不同开发者共同完成一个类的创建
- 给系统对象添加一些我们自定的方法
底层结构
我们给一个类添加分类以后到底是如何实现的呢。
首先我们给类创建分类之后,在程序运行的时候,Runtime会生成一个category_t的结构体,如下
struct category_t {
const char *name;
classref_t cls;
struct method_list_t *instanceMethods; // 对象方法列表
struct method_list_t *classMethods; // 类方法列表
struct protocol_list_t *protocols; // 协议列表
struct property_list_t *instanceProperties; // 属性列表
method_list_t *methodsForMeta(bool isMeta) {
if (isMeta) return classMethods
else return instanceMethods
}
property_list_t *propertiesForMeta(bool isMeta, struct header_info *hi)
}
每创建一个分类都会创建一个结构体。
加载过程
- 首先在程序运行的时候,Runtime会加载这个类的所有的分类,每个分类都会创建一个category_t的结构体
- 把所有category的方法、属性、协议数据合并到有个大数组中,越是后来编译的数据越靠前,类似于进栈和出栈过程
- 将合并后的分类数据(方法、属性、协议),插入到这个类原来的数据的前面
总结:
A: category > 本类 > 父类
B: 分类是在运行时加载的,不是在编译时
沃梦达教程
本文标题为:iOS底层学习——Category(一)


基础教程推荐
猜你喜欢
- iOS Crash常规跟踪方法及Bugly集成运用详细介绍 2023-01-18
- Android实现短信验证码输入框 2023-04-29
- iOS开发使用XML解析网络数据 2022-11-12
- MVVMLight项目Model View结构及全局视图模型注入器 2023-05-07
- iOS中如何判断当前网络环境是2G/3G/4G/5G/WiFi 2023-06-18
- IOS获取系统相册中照片的示例代码 2023-01-03
- Flutter进阶之实现动画效果(三) 2022-10-28
- Android Compose自定义TextField实现自定义的输入框 2023-05-13
- iOS开发 全机型适配解决方法 2023-01-14
- Android开发Compose集成高德地图实例 2023-06-15