『ios』加深对 isa superclass 理解

有下面这种情况

@interface NSObject (Test)

+ (void)test;

@end

#import "NSObject+Test.h"

@implementation NSObject (Test)

- (void)test
{
    NSLog(@"-[NSObject test] - %p", self);
}

@end

如果我执行

  [NSObject test];

会发生什么情况呢?

看下面这张图,我觉得可以很好地解释。


image.png

因为oc方法执行的本质是发送消息也就是obj_msgSend.
那么NSObject要执行test类方法,那么肯定要顺着指针去元类里面去找,但是元类里面没有这个类方法,然后找元类的superClass,元类的superClass也是NSObject,那么里面正好有个test的对象方法,然后就可以执行了。
可以执行的原因呢?为什么明明执行的是类方法,最后却执行了对象方法呢?
那是因为 objc_msgSend([NSObjct class], @selector(test)) 发送消息,并没有说是触发的类方法还是对象方法。所以找到哪个执行哪个,NSObjct中没有类方法+Test,但是有对象方法-test,所以执行test方法。

那如果变为下面这种情况呢?会执行哪个呢?

@implementation NSObject (Test)
+ (void)test
{
    NSLog(@"-[NSObject test] - %p", self);
}
- (void)test
{
    NSLog(@"-[NSObject test] - %p", self);
}

@end

我们可以继续分析,因为执行的是类方法,所以去元类中取找,正好元类中有这个test的类方法,所以就执行了+Test方法。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容