53

Apple の scrollView の例では、彼らはそれを呼び出しません。私はいつもそれが必須だと思っていました。とにかくなぜ私はそれを呼び出す必要がありますか?

4

8 に答える 8

49

メソッドをオーバーライドする場合でも、スーパーでメソッドを呼び出す必要があります。スーパー クラスが現在何もしていない場合でも、Apple が実装を変更すると、不思議なことにコードが動作しなくなる可能性があります。そのメソッドで本当に何もする必要がない場合は、コードから完全に除外してください。そうすれば、スーパーのメソッドは通常どおり実行され、ユーザーの介入は必要ありません。

于 2009-05-05T13:01:55.160 に答える
29

いいえ、 [super viewDidLoad] を呼び出す必要はありません。編集:しかし、私はあなたが間違いなくそうすべきだと思うので、以下を読んでください.

ここで本当のことを言いましょう: Apple は、公開されたサンプル コードに基づくものを含め、何千ものアプリを壊すつもりはありません。現在処理していないイベントを、開発者が止めたくないかもしれないし、止めたくないかもしれない何かを突然行う必要があると判断することによってです。別の動作が必要ない場合は、イベントを停止しないことが重要です。

編集: Apple が互換性を処理する方法を 1 年以上観察した結果、正しいパターンを学習して使用することをお勧めします。アプリケーション バイナリが突然動作を停止することはないと思いますが、iPhone がバイナリのビルド対象の SDK を検出し、これに基づいて OS の動作を変更することは明らかです。

Apple は、将来の SDK で特定のパターンに従うことを要求する日が来るかもしれません。これは、最新の Xcode + SDK で再構築するまでは影響しませんが、ソース コードを変更しなくてもこれらの問題が発生します。安全のためにパターンを学び、それに従ってください。

于 2009-09-11T02:20:13.160 に答える
18

Markus が言うように、UIViewController はその viewDidLoad メソッドで何もしないので、呼び出す必要はありません。ただし、継承構造を変更すると、UIViewController から継承していたクラスが、viewDidLoad メソッドで何かを行うクラスから突然継承するようになった場合に備えて、これは良い習慣です。

于 2009-05-05T12:56:14.690 に答える
11

親と子の 2 つのクラスがあるとします。子は親から継承します。文字列を返すgreetというメソッドがあります。

親メソッドは次のようになります。

コード:

-(NSString *)greet {
   return @"Hello";
}

私たちは子供に両親から学ばせたいと思っています。だから私たちは super を使って、ママがどのように挨拶するかを言いますが、私たち自身の小さな追加もあります.

コード: // 親から継承

-(NSString *)greet {
  NSString *parentGreeting = [super greet];
  return [parentGreeting stringByAppendingString:@", Mommy"]
}

これで、親は「こんにちは」と挨拶し、子供は「こんにちは、ママ」と挨拶します。後で、親のあいさつを「こんにちは」だけを返すように変更すると、両方のクラスが影響を受け、「こんにちは」と「こんにちは、ママ」が表示されます。

super は、スーパークラスによって定義されたメソッドを呼び出すために使用されます。サブクラスによってオーバーライドされたメソッドにアクセスするために使用されるため、クラスは、その親クラスが実装するメソッドを独自のコードでラップできます。なんらかの継承を行う場合、非常に便利です。

于 2014-10-21T11:33:12.977 に答える
9

[super viewDidLoad] を呼び出す必要はありません

私の知る限り、スーパークラス (UIViewController) の viewDidLoad は、ViewController が nib ファイルで初期化されるときに呼び出される空の関数にすぎません。

したがって、初期化を行う必要がある場合は、この関数をオーバーライドして、そこにコードを配置する必要があります。

于 2009-05-05T12:54:44.850 に答える
5

これらの関数で super を呼び出さないと、Xcode 6 の静的アナライザーが警告を発行することに気付きました。したがって、Apple は今、間違いなく私たちにそれを呼び出すことを望んでいるようです。

于 2014-07-06T01:33:52.957 に答える
0

ただし、xCode 7 Beta/Swift 2 では super.viewDidLoad はコンパイルされません。エラーは、それが osx 10.10 でのみ利用可能であり、自動修正がこれを行うことを示しています

if #available(OSX 10.10, *){
super.viewDidLoad()}
else
{
// Fallback on earlier versions
}
// My code
}
于 2015-06-20T11:04:31.400 に答える