1

初心者の質問がありました。self と super の呼び出しの違いを理解しようとしています。継承やその他の基本的な OOP の概念は理解できましたが、self と super の概念はまだ明確ではありません。私の質問を例で説明します。

したがって、以下のコードは、電話が上下逆さまに傾いているときにセグエを実行します。「Scene2ViewController」は「UIViewController」のサブクラスであるため、「Scene2ViewController」は UIViewController のすべてのメソッドを継承することを理解しています。そのため、以下では、メッセージの受信者が自己であるメソッド performSegueWithIdentifier を呼び出しています。「self」を「super」に変更しても、コードは同じように実行されます。super の呼び出しは、self の呼び出しと同じではありませんか? 誰かが私にこれを説明できれば、感謝します。

//Scene2ViewController.m
- (BOOL)shouldAutorotateToInterfaceOrientation:  (UIInterfaceOrientation)interfaceOrientation
{
if (interfaceOrientation == UIInterfaceOrientationPortraitUpsideDown) {
    [self performSegueWithIdentifier:@"SegueToScene1" sender:self];
}

return (interfaceOrientation == 
        UIInterfaceOrientationPortrait);
}
4

3 に答える 3

6

self実際にsuperは両方とも同じオブジェクトを指しています。super現在のクラスではなくスーパークラスでメソッド定義の検索を開始する命令を生成するようコンパイラーに指示するキーワードです。

@interface A : NSObject {}
- (void)foo;
@end

@implementation A
- (void)foo {
    NSLog(@"A's foo!");
}
@end

@interface B : A
@end

@implementation B
- (void)foo {
    NSLog(@"B's foo!");
}
@end

//...somewhere in a method of class B...
[self foo];    // prints "B's foo" in the console
[super foo];    // prints "A's foo" in the console

コメントに従って、最後の行が B のメソッドのどこかにあると仮定すると、B のselfインスタンスを指し、Bのsuper同じインスタンスも指しますself。はクラス B から始まります。 を使用すると、a の検索はB のスーパークラス A から始まります。foofoosuperfoo

super継承された動作を保持したいが、何かを追加したい場合に特に便利です。したがって、 をfoo使用してコール A のバージョンをB に実装することができます[super foo]。そうしないsuperと、継承されたメソッドを呼び出す方法がなくfoo、オーバーライドされたメソッドから呼び出すと、無限再帰が発生します。

于 2012-06-02T18:05:06.040 に答える
5

のメソッドを呼び出すself(または、Objective-C 用語でメッセージを送信するself) と、ランタイムは継承階層でそのメソッドの実装を検索しselfますNSObject。したがって、selfそのメソッドを実装すると、実行されます。そうでない場合は、superクラスがチェックされます。

へのメッセージの送信superは非常に似ていますが、ランタイムが実装の検索を開始しsuper、スキップする点が異なりselfます。

于 2012-06-02T18:07:09.510 に答える
2

場合によっては、サブクラスで、親クラスで既に定義されている関数をオーバーライドすることがあります。多くの場合、これは init 関数で発生します。したがって、親クラスの init 関数を呼び出す必要がある場合は、super を呼び出します。サブクラスの関数が必要な場合は、self を呼び出します。親だけが宣言された関数を持っている場合、Self と super は同じように動作します。ただし、サブクラスのみに宣言がある場合は、スーパーから関数を呼び出すことはできません。

于 2012-06-02T18:09:22.503 に答える