16

私は新しい開発者で、最初のアプリをリリースしようとしています。viewDidUnload以下のAppleのiOS6リリースノートで説明されているように、の非推奨について混乱しています。

iOS 6では、UIViewControllerのviewWillUnloadメソッドとviewDidUnloadメソッドは非推奨になりました。これらのメソッドを使用してデータを解放する場合は、代わりにdidReceiveMemoryWarningメソッドを使用してください。このメソッドを使用して、ビューコントローラのビューが使用されていない場合は、そのビューへの参照を解放することもできます。これを行う前に、ビューがウィンドウにないことをテストする必要があります。

なぜこうなった?この変更によってアプリのパフォーマンスの問題が発生しないようにするには、どのガイドラインに従う必要がありますか?

ありがとう。

4

3 に答える 3

19

Appleによれば、ビューの内部メモリ管理が十分に改善されているため、コンテンツを破棄することで得られるメリットviewWill/DidUnloadは最小限に抑えられています。さらに、アプリがこれらの通知を適切に処理せず、ビューのアンロードに関連付けられていない「その他の」処理を実行するため、多くのアプリがクラッシュすることを示唆するデータがあります。

最後に、メモリの警告が、メモリ不足のためにアプリが終了する前に表示される最初で唯一の警告として検証されるようになりました。これは、実際にはメモリの問題を処理する場所です。

したがって、基本的には、メソッドviewWillUnloadviewDidUnloadメソッドを削除するだけです。でメモリの問題を処理しdidReceiveMemoryWarning、その他のViewController管理を適切な場所で処理します。

編集

質問してもいいですか:それらの「適切な場所」とは何ですか?私は、view [Will /Did]Disappearが完全に適切ではなかった特定の状況でViewdidUnloadを使用していました。ナビゲーションコントローラースタックをさらに下に移動するようなものです。それについてさらに詳しく説明していただけませんか。– dan1one

場合によります。私はそれがあなたが聞きたいものではないことを知っています、しかしそれは真実です:-)

一般に、非対称性は避ける必要があります。したがって、元の操作を「元にした」対称的な方法を使用して、操作を「元に戻す」必要があります。viewDidUnload一般に、とですべてのタイプの作業didReceiveMemoryWarningを実行できるはずですdealloc

いずれにせよ、これらの場所の両方でそのコードのほとんどを複製する必要があったため、これによって実際に変更が発生することはありません。

「ナビゲーションコントローラースタックをさらに下に移動する」とはどういう意味かわかりません。そのため、有用な応答を提供するには、その例を明確にする必要があります。

を使用する際の問題の1つは、ビューが実際に表示されていたため、またはビューの上viewDidDisappearviewDidAppearあったビューが消えていたために、ビューがいつ表示されたかを知るのが難しいことでした...表示されました。

これらのAPIは、これらの問題に対処するのに役立つはずです。

- (BOOL)isMovingFromParentViewController
- (BOOL)isMovingToParentViewController
- (BOOL)isBeingDismissed
- (BOOL)isBeingPresented
于 2012-09-21T21:18:17.177 に答える
8

iOS 6では、ビューがアンロードされることはありません。

つまり、loadViewとは一viewDidLoad度だけ呼び出され、呼び出さviewDidUnloadれることはありません。したがって、View ControllerがviewDidUnloadメモリ不足の状態を処理するために使用する場合は、変更する必要があります。

低メモリ状態に対応する場合はdidReceiveMemoryWarning、このメソッドで一時データとオブジェクトを実装および解放します。

于 2012-09-21T21:42:55.163 に答える
6

iOS 6では、ビューを自分でリリースする必要があります。次のようにします

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];

    if([self isViewLoaded] && self.view.window == nil)
    {
        self.view = nil;
    }
}
于 2012-10-01T06:17:07.770 に答える