有時,didReceiveMemoryWarning被調用,但viewDidUnload不會。在我的情況下,當didReceiveMemoryWarning被調用時,我想強制執行viewDidUnload。didReceiveMemoryWarning - 手動卸載視圖?
我可以這樣說:
[self viewDidUnload];
但會真正卸載看法?沒有自己的「unloadView」。
有時,didReceiveMemoryWarning被調用,但viewDidUnload不會。在我的情況下,當didReceiveMemoryWarning被調用時,我想強制執行viewDidUnload。didReceiveMemoryWarning - 手動卸載視圖?
我可以這樣說:
[self viewDidUnload];
但會真正卸載看法?沒有自己的「unloadView」。
你爲什麼要這麼做?只要你記得調用[super didReceiveMemoryWarning]
(假設你實現了這個方法),UIViewController會自動卸載它的視圖,如果它的視圖沒有超視圖的話。如果這個過程沒有發生,那通常表明視圖仍然是視圖層次結構的一部分,並且卸載不安全。
在相當不太可能的情況下,您確實需要手動卸載視圖,只需簡單地說self.view = nil
即可。
self.view確實卸載視圖,但是如何恢復它? – sol 2010-10-25 18:00:54
'self.view = nil'卸載它。下一次任何人調用'self.view'時,它將被重新加載。注意,這意味着不要調用'self.view',除非你真的想要加載視圖。您可以在調用該函數之前使用'[self isViewLoaded]',以避免將視圖重新加載到您希望保持卸載的位置。 – 2010-10-27 22:22:32
爲了測試我viewDidUnload代碼,我這樣做
-(void)forceUnload {
NSLog(@"forceUnload.enter");
[super didReceiveMemoryWarning];
NSLog(@"forceUnload.leave");
}
我已經進行了廣泛的日誌記錄和設置斷點調查,如果didReceiveMemoryWarning
卸載視圖時UIViewController
不是visibleViewController
。結果:a UIViewController
的view
未獲得卸載(在基於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
}
}
UIViewController將檢查它是否實際上是安全的,卸載它並在didReceiveMemoryWarning中將視圖出口設置爲零。如果視圖未被卸載,則可能不安全。另一個選項可能是[超didReceiveMemoryWarning]在您的自定義實現中未被調用。 – sigsegv 2010-10-22 00:44:43