2012-08-06 110 views
6

我預計[super class]返回超類的類,但我發現,使用這個代碼,它返回這個類的類。爲什麼「[self class] == [super class]」?

代碼

NSLogObject([self class]); 
NSLogObject([super class]); 
NSLogObject([self superclass]); 
NSLogBool([self class] == [super class]); 

輸出

[self class]: MainMenuScene 
[super class]: MainMenuScene 
[self superclass]: CCScene 
[self class] == [super class]:[YES] 

有人能解釋爲什麼出現這種情況,請?我預計它會返回與[self superclass]相同的值。

Macros: 
------- 
#define NSLogBool(i) NSLog(@"%s:[%@]", #i, (i) ? @"YES" : @"NO") 
#define NSLogObject(o) NSLog(@"%s:[%@]", #o, o) 
+2

而且,我沒有說足夠的「class」:「Class class class class class!」 – 2012-08-06 11:55:04

+0

你不應該在你自己的類或宏(或任何其他標識符)中使用蘋果前綴 – JustSid 2012-08-06 12:03:01

+1

我應該如果我想讓他們在我輸入NSLog ...時顯示:P – 2012-08-06 12:03:52

回答

6

[super class]調用當前實例的super方法(即self)。如果自我有一個被覆蓋的版本,那麼它會被調用,它會看起來不同。由於您不覆蓋它,因此致電[self class]與致電[super class]相同。

+0

謝謝。我只是在努力,假設一個名爲「class」的方法應該以某種方式與其餘的oop行爲不同! – 2012-08-06 12:05:13

+0

我承認在閱讀你的問題時我陷入了同樣的陷阱。別擔心。 – mprivat 2012-08-06 14:57:32

+1

即使你沒有覆蓋它,如果'self'是覆蓋該方法的子類的實例,'[self class]'可能與'[super class]'不同。那麼它會調用該子類的實現 – newacct 2012-08-06 17:58:12

2

super是指超類中的方法實現。如果你不覆蓋你的類中的方法,你的類和它的父類中的實現是相同的。

[super class][self class]都調用NSObject定義的相同方法。

+1

即使你沒有覆蓋它,如果'self'是覆蓋該方法的子類的一個實例,'[self class]'可能與'[super class]'不一樣;那麼它會調用該子類的實現 – newacct 2012-08-06 17:58:53

+0

@newacct我知道。 – Sulthan 2012-08-06 18:49:51

0

雖然通過mprivat和Sulthan答案是技術上是正確的,目前的情況是比較複雜一點(和有趣):

考慮調用方法的實現。它使用(當然)對象指針。一個對象指針是指向一個結構的指針,它具有第一個元素(isa)是一個指向對象類的指針。方法(即,mprivat和Sulthan已經正確陳述,在兩種情況下都是相同的)遵循該指針來確定類,即始終調用對象的類。

其結果是,如果A是B的超類,都調用[self class][super class]由B的實例調用,返回B類(A的不,什麼人可以預期由於缺少替代的! )。

相關問題