當我們的程式在第一次收到記憶體不足警告時,應該釋放一些不用的資源,以節省部分記憶體。否則,當記憶體不足情形依然存在,ios再次向我們程式發出記憶體不足的警告時,我們的程式將會被ios kill掉。
low-memory 處理思路
通常乙個應用程式會包含多個view controllers,當從view跳轉到另乙個view時,之前的view只是不可見狀態,並不會立即被清理掉,而是儲存在記憶體中,以便下一次的快速顯現。但是如果應用程式接收到系統發出的low-memory warning,我們就不得不把當前不可見狀態下的views清理掉,騰出更多的可使用記憶體;當前可見的view controller也要合理釋放掉一些快取資料,資源和一些不是正在使用的資源,以避免應用程式崩潰
思路是這樣,具體的實施根據系統版本不同而略有差異,本文將詳細說明一下ios 5與ios 6的low-memory處理。
ios 5 的處理
在ios 6 之前,如果應用程式接收到了low-memory警告,當前不可見的view controllers會接收到viewdidunload訊息(也可以理解為自動呼叫viewdidunload方法),所以我們需要在 viewdidunload 方法中釋放掉所有 outlets ,以及可再次建立的資源。當前可見的view controller 通過didreceivememorywarning 合理釋放資源,具體見**注釋。
舉乙個簡單的例子,有這樣乙個view controller:
@inte***ce myviewcontroller : uiviewcontroller
@property (nonatomic, strong) iboutlet uitableview *tableview;
@end
對應的處理則為:
#pragma mark -
#pragma mark memory management
- (void)didreceivememorywarning
- (void)viewdidunload
ios 6 的處理
ios 6 廢棄了viewdidunload方法,這就意味著一切需要我們自己在didreceivememorywarning中操作。
具體應該怎麼做呢?
1.將 outlets 置為 weak
當view dealloc時,沒有人握著任何乙個指向subviews的強引用,那麼subviews例項變數將會自動置空。
@property (nonatomic, weak) iboutlet uitableview *tableview;
2.在didreceivememorywarning中將快取資料置空
#pragma mark -
#pragma mark memory management
- (void)didreceivememorywarning
不要忘記一點,每當tableview reload 的時候,需要判斷一下 dataarray ,若為空則重新建立。
相容ios 5 與 ios 6
好吧,重點來了,倘若希望程式相容ios 5 與 ios 6怎麼辦呢? 這裡有乙個小技巧,我們需要對didreceivememorywarning 做一些手腳:
#pragma mark -
#pragma mark memory management
- (void)didreceivememorywarning
dataarray = nil;
}self.view.window == nil是判斷一下view是否是window的一部分,如果不是,那麼可以放心的將self.view 置為空,以換取更多可用記憶體。
這樣會是什麼現象呢?假如,從view controller a 跳轉到 view controller b ,然後模擬low-memory警告,此時,view controller a 將會執行self.view = nil ; 當我們從 b 退回 a 時, a 會重新呼叫一次 viewdidload ,此時資料全部重新建立,簡單相容無壓力~~
note:
引自:
iOS6記憶體警告處理
當我們的程式在第一次收到記憶體不足警告時,應該釋放一些不用的資源,以節省部分記憶體。否則,當記憶體不足情形依然存在,ios再次向我們程式發出記憶體不足的警告時,我們的程式將會被ios kill掉。low memory 處理思路 通常乙個應用程式會包含多個view controllers,當從view...
iOS記憶體警告
分享一下我老師大神的人工智慧教程!零基礎,通俗易懂!我們都知道在移動裝置上很多資源都是比較緊缺的,尤其時記憶體,通常都比較小,iphone4也才只有512mb。而且ios4.0以後還支援了多工,這個問題就更加突出了。因此我們在平時設計程式的時候要注意管理好記憶體,減少不必要的開銷,謹防洩露。由於寫的...
IOS 6 基礎框架概覽
原文日期 2012年12月23日 編者按 本文與原文標題略有不同,內容相同。可以看出ios和mac的變化主要就在cocoa touch上面差別。cocoa touch允許你操作螢幕上的事件。cocoa touch multi touch event alerts multi touch contro...