下面的程式會輸出什麼?
@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