わかりました、これは本当に恥ずかしい質問になるでしょうが、初心者向けの本 (特に、通常は役立つインデックス) では気が狂ったように見えました。アプリケーション。
ここでこれを見ましたが、残念ながらそれは私をはるかに超えています。私のアプリで「スーパー」が何をするのか、なぜスーパーと友達になるべきなのか、非常に簡単に説明できる人はいますか? 例えば:
- (void)viewDidLoad {
[super viewDidLoad];}
ありがとう!!
わかりました、これは本当に恥ずかしい質問になるでしょうが、初心者向けの本 (特に、通常は役立つインデックス) では気が狂ったように見えました。アプリケーション。
ここでこれを見ましたが、残念ながらそれは私をはるかに超えています。私のアプリで「スーパー」が何をするのか、なぜスーパーと友達になるべきなのか、非常に簡単に説明できる人はいますか? 例えば:
- (void)viewDidLoad {
[super viewDidLoad];}
ありがとう!!
super
スーパークラスのメソッドの実装を呼び出します。したがって、クラスがを継承する場合UIViewController
は、クラスのメソッド[super viewDidLoad];
を呼び出します。スーパークラスは発生する必要のある重要なことを行う可能性があるため、通常はこれを行う必要があります。viewDidLoadの場合、現在実際に何かが行われるかどうかはわかりませんが、フレームワークの将来のバージョンでは常に可能です。UITableViewController
viewDidLoad
低レベルでself
は、応答する set メソッドへのポインターが含まれています。これは、動的ディスパッチを実装するための基本的なメカニズムです。各クラスには固有のセットが与えられます。C++ に精通している場合、これは概念が仮想テーブルに似ています。objc メソッドは、2 つの隠し引数 (self、_cmd) を持つ C 関数のようなものと考えることができます。
super
の動的に作成された表現でありself
、インスタンスのスーパークラスによって実装された次のインライン メソッドへのポインタを持ちます。この表現は に基づいておりself
、実装されたメソッドの別のセットに向けられているだけです。
@interface MONTypeA : NSObject
- (void)monMethod;
@end
@interface MONTypeB : MONTypeA
- (void)monMethod;
@end
@implementation MONTypeA
- (void)monMethod {
printf("i am MonTypeA\n");
}
@end
@implementation MONTypeB
- (void)monMethod {
[super monMethod]; /* << will call -[MONTypeA monMethod], which will print "i am MonTypeA\n" */
printf("i am MonTypeB\n");
}
@end
のインスタンスを作成するとMONTypeA
、次のように応答しmonMethod
ます。
MONTypeA * a = [MONTypeA new];
[a monMethod];
[a release], a = 0;
// outputs: "i am MonTypeA\n"
MONTypeB * b = [MONTypeB new];
[b monMethod];
[b release], b = 0;
// outputs: "i am MonTypeA\n""i am MonTypeB\n" because -[MONTypeB monMethod] calls through super
したがって、super
この特定のケースでは、呼び出しによってスーパークラスのメソッドの実装が実行されます。
覚えておくことが重要です:super
参照されるメソッドのセットは、常に階層内のメソッドの以前の実装のものであり、スーパークラスのインスタンスが与えられるインスタンス メソッドのセットと同じセットではありません(クラスはすべてのメソッドをオーバーライドする必要がありました)。