viewDidLoadとviewDidAppearの違い


86

違いは何であるviewDidLoadとはviewDidAppear?これらの関数にはどのような初期化またはカスタムコードが入りますか?

たとえばpresentModalViewController、に存在しviewDidAppear、に存在しない場合にのみ機能しviewDidLoadます。


回答:


147

viewDidLoadビューコントローラが最初にメモリにロードされたときに、1回だけ呼び出されます。これは、インスタンス変数をインスタンス化し、このビューコントローラーのライフサイクル全体にわたって存続するビューを構築する場所です。ただし、通常、この時点ではビューはまだ表示されていません。

viewDidAppearビューが実際に表示されているときに呼び出され、View Controllerのライフサイクル中に複数回呼び出すことができます(たとえば、Modal View Controllerが閉じられ、ビューが再び表示されるようになった場合)。これは、UIでレイアウトアクションを実行したり、描画を実行したりする場所です。たとえば、モーダルビューコントローラーを表示します。ただし、ここで行うことはすべて繰り返し可能である必要があります。ここに物を保持しないことをお勧めします。そうしないと、ビューが消えたときにそれらを解放しないとメモリリークが発生します。

参照:https//developer.apple.com/documentation/uikit/uiviewcontroller


15
あなたとWrightsCSは絶対に正しいです。しかし、髪を分割するのではなく、viewDidLoad一般的に一度だけ呼び出されますが、もう一度呼び出される可能性がある状況が1つあります。具体的には、を受け取ったdidReceiveMemoryWarning場合、非表示のビューが解放され(ビューコントローラーは変更されていませんが)、戻ったときにviewDidLoad再度呼び出される場合があります。
ロブ

1
ビューコントローラのivarが常に自動的にリリースされるというコメントに同意するかどうかはわかりません(コントローラ自体はリリースされません)。の後に再度呼び出された場合にリークするviewDidLoadを簡単に作成できると思いdidReceiveMemoryWarningます。しかし、私はあなたviewDidLoadがあなたを書くときに良い習慣を採用するなら、あなたは大丈夫であるべきだということに同意します。私の唯一のポイントは、ivarのずさんな使用と手動のメモリ管理は、間違いなくでリー​​クを引き起こす可能性があるということviewDidLoadです。人々はdidReceiveMemoryWarningシナリオに敏感であり、それに応じてプログラムする必要があります。
ロブ

2
要点を詳しく説明する必要はありませんが、この交換から24時間以内に、別の質問に答えviewDidLoadているときに、にリークする正確な種類のコードの例を見つけましたdidReceiveMemoryWarning。はぁ。
ロブ

1
この答えは、この他の答えと直接矛盾します:stackoverflow.com/a/3411636/269753メモリ警告をまったく受け取らない場合でも、viewDidLoadメソッドが複数回呼び出されるのを観察しています。誰かが明確にしたいですか?
リカルドサンチェス-サエズ2013

2
矛盾があるとは思いません。その質問は、viewDidAppearではなく、viewDidLoadとviewDidUnloadの関係に関するものです。
davidgoli 2013

21

簡単に言えば、で任意のコントロールまたは配列を作成する必要があります。viewDidLoadここで、viewDidAppearこれらのコントロールまたは配列を更新する場所です。

viewDidLoadコントローラの作成時に1回viewDidAppear呼び出され、ビューが表示されるたびに呼び出されます。したがって、提示するモーダルビューがあるとすると、そのビューが却下viewDidAppearされると、呼び出され、viewDidLoad呼び出されません。


3
最初の段落はうまく入れられたヒントです。しかし、2番目の段落は正しくありません。複数回呼び出されるviewDidLoad場合があります。(他のビューのスタックの下で)表示されていないビューが、メモリ不足の状況で古いバージョンのiOSによってアンロードされた場合、View Controllerは、画面に再表示する必要があるときにビューを自動的に再読み込みします。iOSの新しいバージョンでは、以前のiOSが行ったことを実行して、メモリ使用量を削減することを選択できます。メッセージが到着したときにオフスクリーンビューをアンロードします。その場合、は再度呼び出されます。didReceiveMemoryWarningviewDidLoad
バジルバーク2013年

@WrightsCSそれを言っている公式のアップルドキュメントはありますか?「コントローラーの作成時にviewDidLoadが1回呼び出される」過去にviewDidLoadがメモリ不足のシナリオで数回呼び出される可能性があることを覚えているため、どうもありがとう。
リカルド

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.