2012-09-22 32 views
11

在iOS 6中,viewWillUnloadviewDidUnload已棄用,UIViewController不再卸載在內存警告期間屏幕上不可見的視圖。 View Controller Programming Guide有一個如何手動恢復此行爲的示例。在內存警告(Apple文檔缺陷)中卸載iOS 6視圖的正確方法是什麼?

下面是代碼示例:

- (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; 
    } 
} 

下面的代碼示例如下注意事項:

視圖屬性在下一次訪問,認爲是重載 正是因爲它是第一次。

這裏有一個明顯的缺陷。如果未加載其視圖的視圖控制器收到內存警告,則會將其視圖加載到線if ([self.view window] == nil)中,然後繼續清理並再次釋放它。充其量,這是效率低下的。最糟糕的是,如果加載複雜的視圖層次結構和支持數據,則會使內存條件變差。我在iOS模擬器中驗證了這一行爲。

我當然可以對此進行編碼,但對於Apple文檔有這樣的錯誤似乎很奇怪。我錯過了什麼嗎?

回答

17

在用於視圖視圖控制器的正確的校驗被加載和在屏幕上的是:

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

我在IOS 6充滿溶液以具有視圖控制器卸載視圖和清理相似的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'嗎?如果是這樣,我會建議評論代碼,說這兩個方法根本不會在iOS 6中調用(如[UIViewController docs](http://developer.apple.com/library/ios/#documentation /uikit/reference/UIViewController_Class/DeprecationAppendix/AppendixAdeprecatedAPI.html#//apple_ref/occ/instm/UIViewController/viewWillUnload)state)。 – 2012-10-10 13:43:02

+0

好的建議,thx。完成。 – XJones

+0

如果你可以在' - didReceiveMemoryWarning'中相應地調用'[self viewWillUnload]'和'[self viewDidUnload]',而不是自定義' - my_view {Will | Did} Unload',它會不會更好? – Ali

相關問題