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