2011-05-21 71 views
1

有一個在文檔didReceiveMemoryWarning偷看:didReceiveMemoryWarning(iOS中3.0+)

http://developer.apple.com/library/ios/#documentation/uikit/reference/UIViewController_Class/Reference/Reference.html

注意如何說,我引用:

在iOS 3.0及其以後,如果您的視圖 控制器在視圖層次結構中保留對對象 的引用,您應該在 viewDidUnload方法中釋放這些引用。在 早期版本的iOS中,您應該從 方法中繼續釋放它們 。

爲什麼會出現這種情況?在iOS 3.0中做了什麼改變,使得視圖層次視圖不能直接在didReceiveMemoryWarning中清理?我無法想象有什麼可能使這種危險或不好。

任何想法的傢伙?

回答

1

在iOS 3.0 viewDidUnloadviewDidLoad被引入。

如果你看看他們的描述,你會發現:

viewDidLoad中的視圖控制器加載其相關的意見到內存後調用。無論視圖是存儲在nib文件中還是以編程方式在loadView方法中創建,都會調用此方法。

這意味着,無論當你的視圖是從筆尖加載,或當您創建程序(和框架,在正確的時刻loadView呼喚你),你有一個點,你可以訪問您的新的視圖,並完成其初始化,如添加子視圖,或任何你需要的。

的對口viewDidLoadviewDidUnload,你可以覆蓋這樣的:

-(void)viewDidUnload { 
    <do all the necessary clean up> 
    [super viewDidUnload]; 
} 

所以,你有清理一個單點,而且你不需要做任何具體的清理didReceiveMemoryWarning,因爲viewDidUnload是在解除分配視圖時調用的,也就是說,在由於didReceiveMemoryWarning而解除分配時也會調用viewDidUnload

這與之前發生在iOS 3.0中的情況有所不同,您必須提出自己的方案才能完成初始化和清理工作,而且不支持框架,即didReceiveMemoryWarning導致視圖被釋放,您的清理方法不會自動調用,您必須複製清理代碼(並明確在didReceiveMemoryWarning中進行清理)。

+0

哦,對!哇,我怎麼沒有想到檢查viewDidLoad/viewDidUnload是否在3.0之前?我想這似乎是他們對整個過程非常重要,以至於他們一直在那裏一直回到2.0。但顯然不是,嘿。雖然他們現在在那裏的好處是,3.0版本之前的清理方法確實聽起來有點笨拙。太感謝了。 – 2011-05-21 08:38:15

相關問題