用途
- 为已有类添加额外的实例方法、类方法,属性,协议,或通过
runtime
关联对象 间接添加成员变量。- 分类内添加属性,只会生成对应的
set:
、get:
方法声明,不会生成对应的成员变量和方法实现。
- 分类内添加属性,只会生成对应的
- 简化代码阅读,分开臃肿的类。
实现原理
- Category 在编译后,生成底层C/C++代码后为结构体
struct category_t
内部保存着 属性、方法、协议。 - 经过
runtime
运行时内部调用方法。将 属性、方法、协议合并到类中。
runtime
运行时内部调用,底层文件为objc-os.mm
:-
objc_init
运行时初始化。 -
map_images
加载模块。 -
map_images_nolock
加载模块。
-
- 在
objc-runtime-new.mm
-
_read_iamges
读取模块。发现分类,_getObjc2CategoryList()
获取分类列表。 -
remethodizeClass
重定义类的方法。 -
attachCategory
添加分类。将所有分类内属性列表、方法列表、协议列表分别添加进一个二位数组。后编译的分类添加在最见面。 -
attachList
属性列表、方法列表、协议列表分别调用该方法,重新组合。-
realloc
重新分配类内对应列表的内存。添加分类内对应列表的长度。 -
momove
将类对应列表向后移动分类内对应列表的长度。 -
momcpy
将分类内对应列表复制到类对应列表,插入在前面。
-
-
runtime
关联对象 间接添加成员变量。
先声明属性.
-
实现对应属性的
set:
、get:
的方法实现。-
set:
方法内部实现。
objc_setAssociatedObject(self , @selector([属性名]) ,[属性名],[内存管理方法] )
-
get:
方法内部实现。
objc_getAssociatedObject(self , _cmd )
-
-
移除所有管理的对象。
objc_removeAssociatedObject(self )
runtime
关联对象 实现原理
Category 和Class Extension 的区别
- Class Extension 是在编译后合并到类中。
- Category 是
runtime
运行时 合并到类中。