重新認(rèn)識+和-方法
+:(Class)類方法梦皮。
-:(Instance)實例方法。
實質(zhì)上對于runtime而言桃焕,并沒有什么加減號之別剑肯。
消息轉(zhuǎn)發(fā)圖.png
對于runtime而言,+號方法和-號方法观堂,都是一樣的方法让网。
只是+號方法在meta class中查找,而-號方法在class中查找型将。
注意到Root class(meta)的superclass指向了Root class(class)寂祥。
在我們的Root Class正是NSObject。
上圖說明一個問題七兜,如果我們給NSObject發(fā)送+號方法丸凭,它將在meta class中先查找方法,如果查找不到腕铸,會轉(zhuǎn)到Root class(class)中繼續(xù)查找(注意這里面是我們長認(rèn)為的-號方法)惜犀。
代碼驗證:
---------------------------------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;
}
輸出結(jié)果:
Foo from NSObject(Foo)
Person為繼承于NSObject的簡單類,無任何方法實現(xiàn)狠裹。
我們并未給NSObject添加+號Class方法foo虽界,但是我們卻可以給NSObject發(fā)送該消息,還正確的輸出我們的-號方法實現(xiàn)涛菠。
如果我們?nèi)サ鬇implementation NSObject(Foo)中加號+ (void)foo實現(xiàn)的注釋莉御,雖然我們并沒有申明+(void)foo,但是它依然會給NSObject的meta class添加foo方法俗冻。此時[Person foo]消息將可以直接在meta class找到foo實現(xiàn)礁叔,會輸出:
Foo from NSObject Class Method。