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;
}

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

原文地址:https://www.cnblogs.com/muzichenyu/p/14008456.html