7

新しい iOS 6 では非推奨となり、代わりに UIViewController インスタンスとサブクラスのオブジェクトを管理するためviewDidUnloadに使用するように指示されました。内部で行われた方法のように、didReceiveMemoryWarning内部の UIView の種類に nil を割り当てることも同様に効果的ですか?didReceiveMemoryWarningviewDidUnload

これらの 2 つの方法は動作が異なるように見えるため、これを尋ねています。必要なUIViewを再インスタンス化するために再度呼び出されることをdidReceiveMemoryWarning保証していないようです。viewDidLoad

iOS 6 では、手動で UIView の割り当てを解除する必要なく、メモリ管理が行われるのではないかと思います。UIViewController のライフサイクルを理解する上で見逃していることを教えてください。

4

3 に答える 3

13

私の好みの方法は次のとおりです。

- (void)didReceiveMemoryWarning {
    [super didReceiveMemoryWarning];
    if (self.isViewLoaded && !self.view.window) {
        self.view = nil;
    }
    // Do additional cleanup if necessary
}

そうしないとビューにアクセスするとビューが読み込まれるため、テストself.isViewLoadedは不可欠であることに注意してください-WWDCビデオでさえそれを見逃す傾向があります.

サブビューへの他の参照が弱い参照である場合、ここでそれらを nil にする必要はありません。そうでない場合は、それらも nil に設定します。

完全に取り除き、viewDidUnloadそこにあるすべてのコードを適切な場所に移動する必要があります。とにかく、iOS 6より前に呼び出されることは保証されていませんでした。

于 2012-10-03T13:36:38.147 に答える
4

の iOS リファレンスでviewDidUnload:は、これは iOS 6 では非推奨であると記載されています。

メモリ不足の状態でビューがパージされなくなったため、このメソッドが呼び出されることはありません

このコードを に配置することについては何も述べていませんdidReceiveMemoryWarning:。メモリ不足の状態でビューがパージされなくなったため、どちらの方法でもビューのクリーンアップについて心配する必要はありません。

于 2012-10-03T13:22:26.043 に答える
0

Eiko の回答は正しくありません。メモリ不足の警告が表示された場合は、設定self.viewしないでください。nilそうすることは役に立たず、害を及ぼす可能性があります。

iOS 6 は、現在表示されていないビューのビットマップを自動的に解放します。詳細については、 http://thejoeconwayblog.wordpress.com/2012/10/04/view-controller-lifecycle-in-ios-6/を参照してください。

于 2013-07-04T10:08:22.963 に答える