同时处理加减方法
条件1:方法在`NSObject分类`中
条件2:加法声明,减法实现
先到meta-class里找,找不到到它父类中找
+-加减号,只是调用对象的不同!在struct里面都一样
下面输出结果
Compile Error / Runtime Crash / NSLog…?
@interface NSObject (Sark)
+ (void)foo;
@end
@implementation NSObject (Sark)
- (void)foo
{
NSLog(@"IMP: -[NSObject (Sark) foo]");
}
@end
// 测试代码
[NSObject foo];
[[NSObject new] foo];
- 编译运行正常,两行代码都执行-foo方法,都输出:
IMP: -[NSObject (Sark) foo]
该Category只添加了- (void)foo;即实例方法。NSObject元类中的method_list却并没有添加foo类方法
[NSObject foo]:调类方法foo,所以顺着isa指针找NSObject元类中的method_list,没找到,顺着super继承链找
因为NSObject元类的super类是NSObject,正好找到,所以有输出
[NSObject new] foo]; foo本来就被添加到了实例方法列表里了,所以也会有输出
[NSObject foo];
给NSObject类发一个foo消息,沿着isa指针到它的meta-class里,去找所有的加号方法
没有啊,到它的父类中找foo方法
[NSObject foo]查找路线:NSObject meta class → super class → NSObject class
在[[NSObject new] foo]; 编译不通过!
// 使用OC的访问模式,在.h文件中并没有定义- (void)foo方法,所以这里编译错误。
// No visible @interface for 'NSObject' declares the selector 'foo'
// 改成:
id x = [NSObject new];
[x foo];
// 或者在.h文件中定义 - (void)foo;即可
Category加载过程
1. 编译时创建Category结构体,cls编译时没有值
加载时根据name找到类对象
2. 把Category信息加载到类中
实例方法倒序加载到instanceMethod
类方法倒序加载到classMethod
Category的方法添加在前面,同名类方法就不会调用了
3. runtime加载完Category原始信息在类结构就不会存在
即使没有import category的.h头文件,都能够成功调用到Category方法的原因
import只是帮助了编译检查和链接过程
所有信息都加载到类里了