11

iOS 6ではviewWillUnloadviewDidUnloadは非推奨になり、UIViewControllersは、メモリ警告中に画面に表示されないビューをアンロードしなくなりました。View Controllerプログラミングガイドには、この動作を手動で復元する方法の例があります。

コードサンプルは次のとおりです。

- (void)didReceiveMemoryWarning
{
    [super didReceiveMemoryWarning];
    // Add code to clean up any of your own resources that are no longer necessary.
    if ([self.view window] == nil)
    {
        // Add code to preserve data stored in the views that might be
        // needed later.

        // Add code to clean up other strong references to the view in
        // the view hierarchy.
        self.view = nil;
    }
}

コードサンプルの下には、次の注記があります。

次にviewプロパティにアクセスすると、最初のときとまったく同じようにビューが再ロードされます。

ここには明らかな欠陥があります。ビューをロードしていないViewControllerがメモリ警告を受信した場合、そのビューを行にロードしてif ([self.view window] == nil)から、クリーンアップして再度解放します。せいぜい、これは非効率的です。最悪の場合、複雑なビュー階層とサポートデータがロードされると、メモリ状態が悪化します。iOSシミュレーターでこの動作を確認しました。

私は確かにこれを回避してコーディングすることができますが、Appleドキュメントにそのようなエラーがあるのは奇妙に思えます。私は何かが足りないのですか?

4

1 に答える 1

17

ロードされて画面に表示されているビューのViewControllerでの正しいチェックは次のとおりです。

if ([self isViewLoaded] && [self.view window] == nil)

ビューコントローラにビューをアンロードさせ、iOS 5と同様にクリーンアップさせる、iOS6での私の完全な解決策は次のとおりです。

// will not be called in iOS 6, see iOS docs
- (void)viewWillUnload
{
  [super viewWillUnload];
  [self my_viewWillUnload];
}

// will not be called in iOS 6, see iOS docs
- (void)viewDidUnload
{
  [super viewDidUnload];
  [self my_viewDidUnload];
}

// in iOS 6, view is no longer unloaded so do it manually
- (void)didReceiveMemoryWarning
{
  [super didReceiveMemoryWarning];
  if ([self isViewLoaded] && [self.view window] == nil) {
    [self my_viewWillUnload];
    self.view = nil;
    [self my_viewDidUnload];
  }
}

- (void)my_viewWillUnload
{
  // prepare to unload view
}

- (void)my_viewDidUnload
{
  // the view is unloaded, clean up as normal
}
于 2012-09-22T15:22:37.717 に答える