美文网首页
『ios』加深对 isa superclass 理解

『ios』加深对 isa superclass 理解

作者: butterflyer | 来源:发表于2021-06-29 21:19 被阅读0次

有下面这种情况

@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方法。

相关文章

网友评论

      本文标题:『ios』加深对 isa superclass 理解

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