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指向基类的classspa

instance调用对象方法的轨迹

isa找到class,方法不存在,就经过superclass找父类指针

class调用类方法的轨迹

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

isa调用的如图所示:

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

NSObject分类代码以下:blog

#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中调用:io

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

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

相关文章
相关标签/搜索