objective-c runtime method

重新认识+和-方法

+:(Class)类方法。
-:(Instance)实例方法。

实质上对于runtime而言,并没有什么加减号之别。

objective-c runtime method_第1张图片
消息转发图.png

对于runtime而言,+号方法和-号方法,都是一样的方法。
只是+号方法在meta class中查找,而-号方法在class中查找。

注意到Root class(meta)的superclass指向了Root class(class)。
在我们的Root Class正是NSObject。

上图说明一个问题,如果我们给NSObject发送+号方法,它将在meta class中先查找方法,如果查找不到,会转到Root class(class)中继续查找(注意这里面是我们长认为的-号方法)。

代码验证:

---------------------------------NSObject(Foo).h
#import 

@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 
#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。

你可能感兴趣的:(objective-c runtime method)