web-dev-qa-db-ja.com

-viewDidLoadメソッドで常に[super viewDidLoad]を呼び出す必要がありますか?

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

52
Thanks

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

49
George Armhold

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

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

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

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

29
Steven Fisher

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

18
Paul Tomblin

親と子の2つのクラスがあるとします。子は親から継承します。彼らは文字列を返すgreetと呼ばれるメソッドを持っています。

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

コード:

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

私たちは子供に彼の両親から学ぶことを望みます。だからスーパーを使って、ママが挨拶する方法を挨拶しますが、独自の小さな追加もあります。

コード://親から継承

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

だから今、親は「こんにちは」に挨拶し、子供は「こんにちは、ママ」に挨拶します。後で、親の挨拶を「Hi」だけに戻すように変更すると、両方のクラスが影響を受け、「Hi」と「Hi、Mommy」になります。

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

11
Kishore Suthar

AppleのviewDidLoadに関するドキュメントには、[super viewDidLoad]を呼び出す必要があると記載されていないため、Appleの発言をそのまま使用します。ただし、viewDidAppearのような他の同様のメソッドについては、[super viewDidAppear]を呼び出す必要があることに注意してください。

10
Daniel

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

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

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

9
ullmark

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

5
Klaus Thul

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

if #available(OSX 10.10, *){
super.viewDidLoad()}
else
{
// Fallback on earlier versions
}
// My code
}
0
ian