Category实现原理详解

3.将category的类方法和协议,写到对应的元类中。

接下来我们看如何整理category和类的数据

首先我们看下这个方法remethodizeClass

Category实现原理详解

从图中可以看出remethodizeClass主要做以下几件事:

1.修改了类方法列表,协议列表,属性列表。

2.更新了类的方法缓存和子类的方法缓存。

而实现这些,又是通过attachCategories这个方法来实现的。

Category实现原理详解

这个方法主要是将取到方法列表,属性列表,协议列表,倒序插入到列表中,就是说,新生成的category的方法会优先于旧的category的方法插入,然后将category的方法列表,属性列表,协议列表,分别插入到类的方法列表的前面,生成新的数组,看一下attachLists的具体实现。

Category实现原理详解

上边这段代码,分为三种情况:

1.主类中有多个数据集合的时候,使用realloc() 函数将原来的空间拓展,然后把原来的数组复制到后面,最后再把新数组复制到前面。

2.主类中只有一个数据集合的时候,使用malloc()重新申请一块内存,并将原来的集合放到最后面。

3.为空的时候,直接将指针指向新的数据集。

2.category为什么可以新增方法,而不能新增属性呢?

准确来说是可以新增属性,只会生成属性的声明,但是不会生成属性的实例变量,也没有实现setter和getter方法,这是为什么呢?

首先我们看一下类的结构,可以在runtime.h文件中找到

Category实现原理详解

从objc_class结构体中可以看出,ivars是objc_ivar_list指针,methodLists是指向objc_method_list的指针的指针,而且objc_class结构体大小是固定的,不可能往这个结构体中添加数据,只能修改,所以ivars指向的是一个固定区域,只能修改成员变量值,不能增加成员变量个数。methodList是一个二维数组,所以可以修改*methodLists的值来增加成员方法,虽没办法扩展methodLists指向的内存区域,却可以改变这个内存区域的值(存储的是指针)。因此,可以动态添加方法,不能添加成员变量。关于指针的指针

上一页
1 2 3 
下一页