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

相關文章
相關標籤/搜索