2012-09-22 7 views
11

iOS 6では、viewWillUnloadviewDidUnloadは推奨されず、UIViewControllerはメモリ警告時に画面に表示されないビューをアンロードしなくなりました。 View Controller Programming Guideには、この動作を手動で復元する方法の例があります。ここiOS 6でメモリ警告(Apple docの欠陥)でビューをアンロードする適切な方法は何ですか?

は、コードサンプルである:サンプルコード下

- (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 Controllerがメモリ警告を受け取った場合は、そのビューを行if ([self.view window] == nil)にロードしてから、クリーンアップして再度解放します。せいぜい、これは非効率的です。最悪の場合、複雑なビュー階層とサポートするデータがロードされると、メモリ条件が悪化します。私は、iOSシミュレータでこの動作を確認しました。

私は確かにこれをコードすることができますが、アップル社のドキュメントにこのようなエラーがあるのは奇妙なようです。何か不足していますか?

答えて

17

ビューがロードされているため、画面上のビューコントローラにおける正しいチェックがある:IOSの6

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

私の完全なソリューションビューコントローラはIOSの5と同様の図およびクリーンアップをアンロードすることです次のようになります:

// 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 
} 
+0

'viewDidUnload'と' viewWillUnload'は後方互換性のためにありますか?もしそうなら、これら2つのメソッドはiOS 6ではまったく呼び出されないと言うコードをコメントすることをお勧めします([UIViewController docs](http://developer.apple.com/library/ios/#documentation /uikit/reference/UIViewController_Class/DeprecationAppendix/AppendixADeprecatedAPI.html#//apple_ref/occ/instm/UIViewController/viewWillUnload)状態)。 –

+0

良い提案、thx。完了しました。 – XJones

+0

カスタム ' - my_view {Will | Did} Unload'の代わりに、' - didReceiveMemoryWarning'で '[self viewWillUnload]'と '[self viewDidUnload]'を呼び出せればいいのですか? – Ali

関連する問題