isa、superclass调用总结

isa的调用过程

instance的isa指向class class的isa指向meta-class meta-class的isa指向基类的meta-class class的superclass指向父类的class,如果没有父类,superclass指针为nil meta-class的superclass指向父类的meta-class,基类的meta-class的superclass指向基类的class

instance调用对象方法的轨迹

isa找到class,方法不存在,就通过superclass找父类

class调用类方法的轨迹

isa找meta-class,方法不存在,就通过superclass找父类

isa调用的如图所示:

最重要的一点,调用类方法如果本类中找不到,回去父类中找,如果到最后也找不到,会调用元类的对象方法,如果还找不到就会报错

NSObject分类代码如下:

#import <Foundation/Foundation.h>

NS_ASSUME_NONNULL_BEGIN

@interface NSObject (test)
- (void)instanceTest;
@end

NS_ASSUME_NONNULL_END

#import "NSObject+test.h"

@implementation NSObject (test)
- (void)instanceTest {
    NSLog(@"这是对象方法");
}
@end

在main.m中调用:

#import <Foundation/Foundation.h>
#import <objc/runtime.h>
#import "NSObject+test.h"


@interface Person : NSObject
@end

@implementation Person
@end

@interface Student : Person
@end

@implementation Student
@end


int main(int argc, const char * argv[]) {
    @autoreleasepool {

        [Student instanceTest];
    }
    return 0;
}

结果并不会报方法找不到的错误,也证明了上述观点

posted @ 2020-11-19 22:50  木子沉雨  阅读(112)  评论(0编辑  收藏  举报