04-iOS底层学习 | OC 分类 category

71 阅读1分钟
概述
  • 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]