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; }
结果并不会报方法找不到的错误,也证明了上述观点