iOS開發那些事-響應記憶體警告

智捷關東昇發表於2013-02-11

好的應用應該在系統記憶體警告情況下釋放一些可以重新建立的資源。在iOS中我們可以在應用程式委託物件、檢視控制器以及其它類中獲得系統記憶體警告訊息。

1、應用程式委託物件

在應用程式委託物件中接收記憶體警告訊息,需要重寫applicationDidReceiveMemoryWarning:方法。AppDelegate的程式碼片段:

- (void)applicationDidReceiveMemoryWarning:(UIApplication *)application

{

NSLog(@”AppDelegate中呼叫applicationDidReceiveMemoryWarning:”);

}

2、檢視控制器

在檢視控制器中接收記憶體警告訊息,需要重寫didReceiveMemoryWarning方法。ViewController的程式碼片段:

- (void)didReceiveMemoryWarning

{

NSLog(@”ViewController中didReceiveMemoryWarning呼叫”);

[super didReceiveMemoryWarning];

//釋放成員變數

[_listTeams release];

}

注意釋放資原始碼應該放在[super didReceiveMemoryWarning]語句下面。

3、其它類

在其它類中可以使用通知,在記憶體警告時候iOS系統會發出UIApplicationDidReceiveMemoryWarningNotification通知,凡是在通知中心註冊了UIApplicationDidReceiveMemoryWarningNotification通知的類都會接收到記憶體警告通知。ViewController的程式碼片段:

- (void)viewDidLoad

{

[super viewDidLoad];

NSBundle *bundle = [NSBundle mainBundle];

NSString *plistPath = [bundle pathForResource:@"team"

ofType:@"plist"];

//獲取屬性列表檔案中的全部資料

NSArray *array = [[NSArray alloc] initWithContentsOfFile:plistPath];

self.listTeams = array;

[array release];

//接收記憶體警告通知,呼叫handleMemoryWarning方法處理

NSNotificationCenter *center = [NSNotificationCenter defaultCenter];

[center addObserver:self

           selector:@selector(handleMemoryWarning)

               name:UIApplicationDidReceiveMemoryWarningNotification

             object:nil];

}

//處理記憶體警告

-(void) handleMemoryWarning

{

NSLog(@”ViewController中handleMemoryWarning呼叫“);

}

我們在viewDidLoad方法中註冊UIApplicationDidReceiveMemoryWarningNotification訊息,接收到報警資訊呼叫handleMemoryWarning方法。這些程式碼完全可以寫在其它類中,在ViewController中重寫didReceiveMemoryWarning方法就可以了,本例這是示意性介紹一下UIApplicationDidReceiveMemoryWarningNotification報警訊息。

記憶體警告在裝置上出現並不是經常的,一般我們沒有辦法模擬,但模擬器上有一個功能可以模擬記憶體警告,啟動模擬器,選擇模擬器選單硬體→模擬記憶體警告,這個時候我們會在輸出視窗中看到記憶體警告發生了。

2012-11-06 16:49:16.419 RespondMemoryWarningSample[38236:c07] Received memory warning.

2012-11-06 16:49:16.422 RespondMemoryWarningSample[38236:c07] AppDelegate中呼叫applicationDidReceiveMemoryWarning:

2012-11-06 16:49:16.422 RespondMemoryWarningSample[38236:c07] ViewController中handleMemoryWarning呼叫

2012-11-06 16:49:16.423 RespondMemoryWarningSample[38236:c07] ViewController中didReceiveMemoryWarning呼叫

相關文章