IPhone下每個app可用的內存是被限制的,如果一個app使用的內存超過20M,則系統會向該app發送Memory Warning消息。收到此消息后,app必須正確處理,否則可能出錯或者出現內存泄露。
app收到Memory Warning后會調用:
UIApplication::didReceiveMemoryWarning -> UIApplicationDelegate::applicationDidReceiveMemoryWarning,然后調用當前所有的viewController進行處理。因此處理的主要工作是在viewController。
我們知道,創建viewcontroller時,執行順序是loadview -> viewDidLoad。
當收到內存警告時,如果viewcontroller未顯示(在后台),會執行didReceiveMemoryWarning -> viewDidUnLoad;如果viewcontroller當前正在顯示(在前台),則只執行didReceiveMemoryWarning。
當重新顯示該viewController時,執行過viewDidUnLoad的viewcontroller(即原來在后台)會重新調用loadview -> viewDidLoad。
因此主要注意下面幾個函數:
loadView | 創建view,構建界面; |
viewDidLoad | 做些初始化工作。由於在初次創建viewcontroller和重新恢復時都會調用,因此這個函數需要注意區分不同的情況,設置正確的狀態。 |
didReceiveMemoryWarning | 釋放不必須的內存,比如緩存,未顯示的view等。 |
viewDidUnLoad | 最大程度的釋放可以釋放的內存。比如應該釋放view,這些view在調用loadview后可以重新生成。(其中成員變量釋放后應設置為nil)。對於非界面的數據是否釋放,需要具體分析,可以恢復的數據可以釋放,不能恢復的數據就不要釋放。 |
實際中如果viewcontroller是用xib生成的界面,則需要我們做的就比較少,主要是在viewDidLoad中恢復原來的界面狀態。
如果是通過編程創建的界面,則需要做的工作就要更多些,上面4個函數中都需要進行正確處理。