ビューの強制的なロード/アンロード
-
22-07-2019 - |
質問
Navigation Controllerにプッシュされ、Navigation Controllerビューからポップされたときにオブジェクトを解放するだけで、ビューのフィールドを更新するようにView Controllerを設定するにはどうすればよいですか。
私の目標は、View Controllerのことです:
- ナビゲーションコントローラースタックにプッシュされたときにのみ表示を更新する
- データがNavigation Controllerスタックからポップされるとデータをリリースします
- 可能な限りコントローラーを再利用します(xibファイルのロード/アンロードのオーバーヘッドを排除するため)
viewWillBePushed:
および viewWillBePopped:
のデリゲートメソッドはありますか?
例
ビューの3つのレイヤーがあるとしましょう:
Movies (MovieListController)
--> Movie Basic Info (MovieInfoController)
--> Movie Credits (MovieCreditsController)
各映画を表すクラス Movie
があると仮定します。
ここでは、3つの UIViewController
のみを持ち、プログラムのランタイムにそれぞれ1つのインスタンスを作成します。したがって、同じ MovieInfoController
を異なる映画に再利用でき、同様に MovieCreditsController
を再利用できます。
ただし、 MovieInfoController
も、スタックにプッシュされた場合にのみビューフィールド(タイトル、リリース日など)を更新するようにします。 viewWillAppear
に表示を実装すると、 MovieCreditsController
がポップされた場合でも、強制的にフィールドを更新します。
また、 MovieInfoController
がポップされたときに Movie
への参照と、潜在的に大きなオブジェクト(カバーイメージなど)を解放するようにします。 viewWillDisappear
にこのロジックを実装すると、スタック上の MovieCreditsController
をプッシュするときにデータが解放されます。
合理的ですか?私はそれについて間違った方法で行っていますか?
解決
Movieオブジェクトを作成したため、そこに90%います。 MovieListControllerは、単一のMovieInfoControllerを所有する必要があります。 Navigation Controllerにプッシュする前に、 -setMovie:
を呼び出す必要があります。 -setMovie:
への呼び出しは、フィールドを更新するものでなければなりません。
同様に、MovieInfoControllerは単一のMovieCreditsControllerを所有し、navコントローラーにプッシュする前に -setMovie:
を呼び出す必要があります。
MovieListControllerおよびMovieInfoControllerでは、 -viewDidAppear:
で [subController setMovie:nil]
を呼び出してメモリを解放できます。