iPhone下每個app可用的內存是被限制的,如果一個app使用的內存超過20M,則系統會向該app發送MemoryWarning消息。收到此消息後,app必須正確處理,否則可能出錯或者出現內存洩露。
app收到MemoryWarning後會調用:UIApplication::didReceiveMemoryWarning->UIApplicationDelegate::applicationDidReceiveMemoryWarning,然後調用當前所有的viewController進行處理。因此處理的主要工作是在viewController。
當我們的程序在第一次收到內存不足警告時,應該釋放一些不用的資源,以節省部分內存。否則,當內存不足情形依然存在,iOS再次向我們程序發出內存不足的警告時,我們的程序將會被iOS kill掉。
iOS的UIViewController類給我們提供了處理內存不足的接口。在iOS 3.0之前,當系統的內存不足時,UIViewController的didReceiveMemoryWarining方法會被調用,我們可以在didReceiveMemoryWarining方法裡釋放掉部分暫時不用的資源。
從iOS3.0開始,UIViewController增加了viewDidUnload方法。該方法和viewDIdLoad相配對。當系統內存不足時,首先UIViewController的didReceiveMemoryWarining方法會被調用,而didReceiveMemoryWarining會判斷當前ViewController的view是否顯示在window上,如果沒有顯示在window上,則didReceiveMemoryWarining會自動將viewcontroller的view以及其所有子view全部銷毀,然後調用viewcontroller的viewdidunload方法。如果當前UIViewController的view顯示在window上,則不銷毀該viewcontroller的view,當然,viewDidunload也不會被調用了。但是到了ios6.0之後,這裡又有所變化,ios6.0內存警告的viewDidUnload被屏蔽,即又回到了ios3.0的時期的內存管理方式。
iOS3-iOS5.0以前版本收到內存警告:
調用didReceiveMemoryWarning內調用super的didReceiveMemoryWarning會將controller的view進行釋放。所以我們不能將controller的view再次釋放。
處理方法:
Java代碼