概述
- category 可以给类添加方法(实例方法,类方法)
- 调用优先级:
- category的方法 > 类的方法
- 后编译的category > 先编译的category
- 可以给category添加属性
- category只是添加属性的定义,并没有实现setter,getter方法
原理
- 编译时
- 每一个category会生成一个category_t的结构体对象,里面有属性,方法,协议等信息
- 多个category_t结构体会放在category_list中
- 运行时
- 通过Runtime加载类的所有category
- 把所有类的category的属性,方法,协议等信息加载到一个二维数组中,后编译的category信息放在数组前面
- 调用时
- 后编译的category > 先编译的category > 类的方法
load方法
#import "Car.h"
@implementation Car
+ (void)load
{
NSLog(@"%s",__FUNCTION__);
}
@end
#import "BMW.h"
@implementation BMW
+ (void)load
{
NSLog(@"%s",__FUNCTION__);
}
@end
#import "Car+Test.h"
@implementation Car (Test)
+ (void)load
{
NSLog(@"%s",__FUNCTION__);
}
@end
#import "BMW+Test.h"
@implementation BMW (Test)
+ (void)load
{
NSLog(@"%s",__FUNCTION__);
}
@end
+[Car load]
+[BMW load]
+[BMW(Test) load]
+[Car(Test) load]
- 上面BMW是Car的子类
- category调用顺序
- 先处理父类,在处理子类
- 先处理类,在处理category
- 先编译,先调用
initialize
- initialize在类调用alloc是才会调用
- 无论初始化多少个类,initialize只会调用一次
- 子类初始化调用initialize时,也会调用父类的initialize
- category会覆盖类的initialize
[BMW alloc]
打印
+[Car initialize]
+[BMW initialize]