2010-10-22 57 views
2

有時,didReceiveMemoryWarning被調用,但viewDidUnload不會。在我的情況下,當didReceiveMemoryWarning被調用時,我想強制執行viewDidUnload。didReceiveMemoryWarning - 手動卸載視圖?

我可以這樣說:

[self viewDidUnload]; 

但會真正卸載看法?沒有自己的「unloadView」。

+0

UIViewController將檢查它是否實際上是安全的,卸載它並在didReceiveMemoryWarning中將視圖出口設置爲零。如果視圖未被卸載,則可能不安全。另一個選項可能是[超didReceiveMemoryWarning]在您的自定義實現中未被調用。 – sigsegv 2010-10-22 00:44:43

回答

5

你爲什麼要這麼做?只要你記得調用[super didReceiveMemoryWarning](假設你實現了這個方法),UIViewController會自動卸載它的視圖,如果它的視圖沒有超視圖的話。如果這個過程沒有發生,那通常表明視圖仍然是視圖層次結構的一部分,並且卸載不安全。

在相當不太可能的情況下,您確實需要手動卸載視圖,只需簡單地說self.view = nil即可。

+1

self.view確實卸載視圖,但是如何恢復它? – sol 2010-10-25 18:00:54

+1

'self.view = nil'卸載它。下一次任何人調用'self.view'時,它將被重新加載。注意,這意味着不要調用'self.view',除非你真的想要加載視圖。您可以在調用該函數之前使用'[self isViewLoaded]',以避免將視圖重新加載到您希望保持卸載的位置。 – 2010-10-27 22:22:32

1

爲了測試我viewDidUnload代碼,我這樣做

-(void)forceUnload { 
    NSLog(@"forceUnload.enter"); 
    [super didReceiveMemoryWarning]; 
    NSLog(@"forceUnload.leave"); 
} 
1

我已經進行了廣泛的日誌記錄和設置斷點調查,如果didReceiveMemoryWarning卸載視圖時UIViewController不是visibleViewController。結果:a UIViewControllerview未獲得卸載(在基於UINavigationController的項目中使用ARC進行測試)。您需要將self.view設置爲零,並且將在self.view再次被調用時重新加載。即使日誌記錄self.view將重新初始化它 - 使用isViewLoaded來測試它是否加載,而不是檢查nil的屬性。

#define String(fmt,...) [NSString stringWithFormat:fmt,__VA_ARGS__] 
#define NSStringFromBOOL(aBool) String(@"%@", [email protected]"YES":@"NO") 
- (void)didReceiveMemoryWarning 
{ 
    NSLog(@"%s", __FUNCTION__); //-[ViewController didReceiveMemoryWarning] 
    [super didReceiveMemoryWarning]; 
    if (![self.navigationController.visibleViewController isEqual:self]) 
    { 
     NSLog(@"%@",NSStringFromBOOL(self.isViewLoaded)); //YES 
     self.view = nil; 
     NSLog(@"%@",NSStringFromBOOL(self.isViewLoaded)); //NO 
    } 
}