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
isa找到class,方法不存在,就經過superclass找父類指針
isa找meta-class,方法不存在,就經過superclass找父類code
最重要的一點,調用類方法若是本類中找不到,回去父類中找,若是到最後也找不到,會調用元類的對象方法,若是還找不到就會報錯對象
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