下面的代碼輸出什麼?
@implementation Son : Father
- (id)init
{
self = [super init];
if (self) {
NSLog(@”%@”, NSStringFromClass([self class]));
NSLog(@”%@”, NSStringFromClass([super class]));
}
return self;
}
@end
答案:
都輸出 Son
首先方法class是NSObject
的方法,這個方法的意思是返回當前對象的所屬類。上面的例子不管是[self class]
或者是[super class]
都是Son類的對象所調用的。
我們每一個類對象最開始的位置都會有一個isa指針,該指針只想一塊內存區域,該部分主要包含兩部分信息:
1.指向父類的指針
2.自身的方法分發表
在調用對象的某一個方法的時候就需要跑一個調用的流程,首先會在自身尋找當前類的分發表,如果找不到對應的方法會繼續去其父類中尋找該方法,依次類推直到找到對應的方法
根據中間的提示,現在問題的答案出來了
在Son和Father都沒有重寫class方法的前提下,無論是[self class]
或者[super class]
都是要一直調用到NSObject
中的class
方法,因爲這個方法自身並沒有重寫,無論是Son類或者Father分發表中都不含有class這個類。
這樣一直調用,最終會返回的都是當前對象(所屬是Son類)所屬的類,也就是Son類。