美文网首页
objective-c runtime method

objective-c runtime method

作者: jackjhu | 来源:发表于2015-09-07 17:25 被阅读107次

    重新认识+和-方法

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

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

    消息转发图.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 <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。

    相关文章

      网友评论

          本文标题:objective-c runtime method

          本文链接:https://www.haomeiwen.com/subject/iljycttx.html