Category

iOS | Category | Objective-C

Category的实现原理?Category和Class Extension的区别是什么?Category中的load方法时什么时候调用的?如何给分类添加属性?


通过前面章节,我们有学习到OC实例方法存储在class对象里面,类方法存储在meta-class里面,那么分类里面方法呢,难道是一个新的对象来进行存储么?

答案肯定是否,class对象、meta-class对象在内存中只会存在一份,分类里面的方法会合并到class对象、meta-class中

1.Category的实现原理

Category内方法是什么时候合并到class、meta-class对象中的,是在编译阶段么?

并不是,是在程序运行时通过runtime机制动态将分类的方法合并到class、meta-class对象中。下面来通过探索源码来进行分析验证。

1
2
3
4
5
6
7
8
9
10
11
12
13
@interface Person (Test_A)
+ (void)testA;
- (void)testA;
@end

@implementation Person (Test_A)
+ (void)testA {
NSLog(@"%s", __func__);
}
- (void)testA {
NSLog(@"%s", __func__);
}
@end

通过clang编译器将 Person+Test_A.m 文件转成cpp文件,搜索 struct _category_t {

1
2
3
4
5
6
7
8
struct _category_t {
const char *name;
struct _class_t *cls;
const struct _method_list_t *instance_methods;
const struct _method_list_t *class_methods;
const struct _protocol_list_t *protocols;
const struct _prop_list_t *properties;
};

Person+Test_A这个分类在编译完,转成上面这种结构,Test_A分类里面的方法、协议、属性信息也是存储在这个结构体中。每编写一个分类,就相当于一个 struct _category_t 类型的结构体,在程序运行时,通过runtime机制动态的将这个结构体内部的方法、协议等合并到类对象中。