self和super網上的小題目

下面的代碼輸出什麼?
@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類。

發佈了31 篇原創文章 · 獲贊 3 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章