6

スーパークラスのクラスを返すことを期待[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]ます。

マクロ:
-------
#define NSLogBool(i) NSLog(@"%s:[%@]", #i, (i) ? @"YES" : @"NO")
#define NSLogObject(o) NSLog(@"%s:[%@]", #o, o)
4

3 に答える 3

6

[super class]super現在のインスタンス (つまり)のメソッドを呼び出しますself。self にオーバーライドされたバージョンがある場合、それが呼び出され、見た目が異なります。オーバーライドしないため、呼び出し[self class]は の呼び出しと同じ[super class]です。

于 2012-08-06T11:59:47.770 に答える
3

superスーパークラスのメソッド実装を参照します。クラスでメソッドをオーバーライドしない場合、クラスとそのスーパークラスの実装は同じです。

と の両方で、 で定義された同じメソッド[super class]を呼び出します。[self class]NSObject

于 2012-08-06T12:00:23.760 に答える
0

mprivat と Sulthan による回答は技術的には正しいですが、現在のケースはもう少し複雑です (そして興味深い):

メソッドへの呼び出しの実装を検討します。(もちろん) オブジェクト ポインターを使用します。オブジェクト ポインターは、最初の要素 ( isa) がオブジェクト クラスへのポインターである構造体へのポインターです。classメソッド (つまり、mprivat と Sulthan が正しく述べているように、どちらの場合もまったく同じ) は、このポインターに従って、クラス、つまり常に呼び出し元のオブジェクトのクラスを決定します

その結果、A が B のスーパークラスである場合、呼び出し[self class][super class]B のインスタンスによる呼び出しの両方で、B のクラスが返されます ( A ではなく、オーバーライドがないために予想されるものです!)。

于 2012-08-06T12:52:13.697 に答える