Category实现原理详解

category是Objective-C 2.0之后添加的语言特性,在苹果的系统库得到广泛使用,比如:UIView,使用category主要有以下几个好处:

1.可以把不同的功能组织到不同的category里,使代码更加清晰简洁,比较容易维护。

2.可以减少单个文件的大小,比如ViewController一般会特别大,可以使用category按功能拆分,减小单个文件的大小。

3.声明私有方法,还可以按需加载想要的category

4.应对需求的变化,可以很方便的对类进行扩展。

1.Category的实现原理

Category实现原理详解

首先,我们可以看下Category的结构

那么category怎么实现在类上添加方法的呢???

下面从runtime的源码说起了,首先我们从苹果的官网上下载源码,最新源码是objc4-709.tar.gz。

1.objc源代码中有 objc-os.mm文件, 函数_objc_init为runtime的入口,入口中调用了_dyld_objc_notify_register(&map_images, load_images, unmap_image);

2.然后调用objc-runtime-new.mm -> map_images加载map到内存

3.之后map_images中又调用objc-runtime-new.mm->_read_images初始化内存中的map

4.这时候_read_images中包含了category的处理,我们可以找到Discover categories.的注释,从这一行下面开始就是。

然后,我们找到objc-runtime-new.mm的源文件,然后搜索category的相关代码。

Category实现原理详解

从上图可以看出,Discover categories主要做了以下几件事:

1.首先判断这个这个category所对应的类是否存在,如果为nil,则将整个这个类的category置为nil。

2.如果这个category的实例方法或者协议或者属性存在并且这个类是实现的,则重新整理类的数据。

1 2 3 
下一页