iOS底层学习——Category(一)

文章目录

分类的目的

我们为什么会用到分类呢,我觉得有以下原因

  • 为了让不同功能模块化分别写在不同文件中,便于管理和后期修改与维护
  • 减少单个文件的代码量
  • 这就可以让不同开发者共同完成一个类的创建
  • 给系统对象添加一些我们自定的方法

底层结构

我们给一个类添加分类以后到底是如何实现的呢。
首先我们给类创建分类之后,在程序运行的时候,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: 分类是在运行时加载的,不是在编译时
上一篇:java框架基础教程-------spring注入对象(二)


下一篇:flink sql 写 kudu