iOS開發 關於Super的題目

GabrielPanda發表於2018-01-24

下面的程式會輸出什麼?

@implementation Son : Father 
- (id)init 
{ 
self = [super init]; 
if (self) 
{ 
NSLog(@”%@”, NSStringFromClass([self class])); 
NSLog(@”%@”, NSStringFromClass([super class])); 
} 
return self; 
} 
@end
複製程式碼

答案:兩句輸出語句均輸出:Son

為什麼? 簡單來說,self和super都是指向當前例項的,不同的是,[self class]會在當前類的方法列表中去找class這個方法,[super class]會直接開始在當前類的父類中去找calss這個方法,兩者在找不到的時候,都會繼續向祖先類查詢class方法,最終到NSObject類。 由於我們在Father和Son中都沒有去重寫class這個方法,最終自然都會去執行NSObject中的class方法,結果也自然應該是一樣的。 至於為什麼是Son,我們可以看看NSObject中class的實現:

-(Class)class 
{ 
return object_getClass(self); 
}
複製程式碼

這就說的通了,返回的都是self的型別,self此處正好就是Son,因此結果就會輸出Son

相關文章