2

わかりました、これは本当に恥ずかしい質問になるでしょうが、初心者向けの本 (特に、通常は役立つインデックス) では気が狂ったように見えました。アプリケーション。

ここでこれを見ましたが、残念ながらそれは私をはるかに超えています。私のアプリで「スーパー」が何をするのか、なぜスーパーと友達になるべきなのか、非常に簡単に説明できる人はいますか? 例えば:

- (void)viewDidLoad {
[super viewDidLoad];}

ありがとう!!

4

2 に答える 2

6

superスーパークラスのメソッドの実装を呼び出します。したがって、クラスがを継承する場合UIViewControllerは、クラスのメソッド[super viewDidLoad];を呼び出します。スーパークラスは発生する必要のある重要なことを行う可能性があるため、通常はこれを行う必要があります。viewDidLoadの場合、現在実際に何かが行われるかどうかはわかりませんが、フレームワークの将来のバージョンでは常に可能です。UITableViewControllerviewDidLoad

于 2011-03-11T21:21:22.283 に答える
2

低レベルで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参照されるメソッドのセットは、常に階層内のメソッドの以前の実装のものであり、スーパークラスのインスタンスが与えられるインスタンス メソッドのセットと同じセットではありません(クラスはすべてのメソッドをオーバーライドする必要がありました)。

于 2011-03-11T22:44:44.397 に答える