1. 程式人生 > >iOS在開發過程中記憶體出現不足,應當怎樣解決,記憶體警告

iOS在開發過程中記憶體出現不足,應當怎樣解決,記憶體警告

本文主要講述了當iOS應用出現記憶體不足時,如何解決該問題,現在把相關的思路和實現程式碼整理出來分享給iOS程式設計師,希望給他們的開發工作帶來幫助。
記憶體警告
ios下每個app可用的記憶體是被限制的,如果一個app使用的記憶體超過了這個閥值,則系統會向該app傳送Memory Warning訊息。收到訊息後,app必須儘可能多的釋放一些不必要的記憶體,否則OS會關閉app。
幾種記憶體警告級別(便於理解記憶體警告之後的行為)
Memory warning level:

複製程式碼 程式碼如下: typedef enum {
OSMemoryNotificationLevelAny      = -1,

OSMemoryNotificationLevelNormal   =  0,
OSMemoryNotificationLevelWarning  =  1,
OSMemoryNotificationLevelUrgent   =  2,
OSMemoryNotificationLevelCritical =  3
}OSMemoryNotificationLevel;(5.0以後廢棄了)

1、Warning (not-normal) ― 退出或者關閉一些不必要的後臺程式 e.g. Mail
2、Urgent ― 退出所有的後臺程式 e.g. Safari and iPod.
3、Critical and beyond ― 重啟

響應記憶體警告:
在應用程式委託中實現applicationDidReceiveMemoryWarning:方法:
應用程式委託物件中接收記憶體警告訊息
在您的UIViewController子類中實現didReceiveMemoryWarning方法:
檢視控制器中接收記憶體警告訊息
註冊UIApplicationDidReceiveMemoryWarningNotification通知:
其它類中使用通知接收記憶體警告訊息(例如:清理快取資料)

View Controller

生成view:
loadView
1、loadView在每一次使用self.view這個property,並且self.view為nil的時候被呼叫,用以產生一個有效的self.view(手工維護views,必須重寫該方法)


2、view 控制器收到didReceiveMemoryWarning的訊息時, 預設的實現是檢查當前控制器的view是否在使用。 如果它的view不在當前正在使用的view hierarchy裡面,且你的控制器實現了loadView方法,那麼這個view將被release, loadView方法將被再次呼叫來建立一個新的view。(注:ios6.0以下 如果沒有實現loadview,記憶體警告時不會呼叫viewDidUnload)
viewDidLoad
一般我們會在這裡做介面上的初始化操作,比如往view中新增一些子檢視、從資料庫或者網路載入模型資料到子檢視中
官網提供的生成view的流程圖:
2015107101638194
官網提供的解除安裝view的流程圖:
2015107101704363
On iOS 5 and Earlier
1 系統發出警告或者ViewController本身呼叫導致didReceiveMemoryWarning被呼叫
2 呼叫viewWillUnload之後釋放View
3 呼叫viewDidUnload
ios5.0 LeaksDemo

複製程式碼 程式碼如下:  -(void)didReceiveMemoryWarning
{
//In earlier versions of iOS, the system automatically attempts to unload a view controller's views when memory is low
[super didReceiveMemoryWarning];

//didReceiveMemoryWarining 會判斷當前ViewController的view是否顯示在window上,如果沒有顯示在window上,則didReceiveMemoryWarining 會自動將viewcontroller 的view以及其所有子view全部銷燬,然後呼叫viewcontroller的viewdidunload方法。

}
- (void)viewDidUnload
{
// 被release的物件必須是在 viewDidLoad中能重新建立的物件
// For example:
self.myOutlet = nil;
self.tableView = nil;
dataArray = nil;

[super viewDidUnload];
}