重新认识+和-方法
+:(Class)类方法。
-:(Instance)实例方法。
实质上对于runtime而言,并没有什么加减号之别。
对于runtime而言,+号方法和-号方法,都是一样的方法。
只是+号方法在meta class中查找,而-号方法在class中查找。
注意到Root class(meta)的superclass指向了Root class(class)。
在我们的Root Class正是NSObject。
上图说明一个问题,如果我们给NSObject发送+号方法,它将在meta class中先查找方法,如果查找不到,会转到Root class(class)中继续查找(注意这里面是我们长认为的-号方法)。
代码验证:
---------------------------------NSObject(Foo).h
#import <Foundation/Foundation.h>
@interface NSObject (Foo)
//+ (void)foo;
- (void)foo;
@end
---------------------------------NSObject(Foo).m
#import "NSObject+Foo.h"
@implementation NSObject (Foo)
- (void)foo {
NSLog(@"Foo from NSObject(Foo)");
}
//+ (void)foo {
// NSLog(@"Foo from NSObject Class Method");
//}
@end
---------------------------------main.m
#import <Foundation/Foundation.h>
#import "Person.h"
#import "NSObject+Foo.h"
int main(int argc, const char * argv[]) {
@autoreleasepool {
[Person foo];
}
return 0;
}
输出结果:
Foo from NSObject(Foo)
Person为继承于NSObject的简单类,无任何方法实现。
我们并未给NSObject添加+号Class方法foo,但是我们却可以给NSObject发送该消息,还正确的输出我们的-号方法实现。
如果我们去掉@implementation NSObject(Foo)中加号+ (void)foo实现的注释,虽然我们并没有申明+(void)foo,但是它依然会给NSObject的meta class添加foo方法。此时[Person foo]消息将可以直接在meta class找到foo实现,会输出:
Foo from NSObject Class Method。