2010-07-06 53 views
6

當應用程序進入後臺運行狀態時,多少髒內存使用情況良好。在蘋果視頻中提到應儘可能減少髒內存。iOS4 - 快速上下文切換

但在我的應用程序中,我使用導航控制器來推送和彈出視圖。從大約20個不同的頁面移動後,髒內存使用量達到30 MB左右。

同樣在「dismissModalViewControllerAnimated」和「popViewControllerAnimated」上,不調用dealloc。

我有兩個疑惑:

  1. 有了多少骯髒的內存是可以接受去住?
  2. 什麼是導航控制器的備用支持後退按鈕?

在此先感謝。

+0

1.不是30MB。較舊的iOS設備只有128MB內存,所以你的應用程序本身可以填充大約23%... 2.如果你真的泄漏了30MB,你可能不會釋放某些東西,它不是'UINavigationController'的錯誤。 – 2010-07-06 13:20:36

+0

Hi Douwe, 感謝您的回覆。 爲什麼我懷疑UINavigationController,因爲我一直在推送視圖控制器。當我從導航控制器彈出視圖控制器時,不會調用dealloc方法,在這裏我釋放已定義的實例變量。內存不會被所有這些實例變量所使用。 我做錯了什麼?我是否必須在其他地方清除實例變量,而不是在dealloc中? – Sunil 2010-07-06 14:35:47

+0

你有任何其他引用到你的視圖控制器,在你的應用程序的其他地方?如果你彈出它們,但仍然有其他地方參考控制器,它不會得到GCed – blueberryfields 2010-09-28 15:30:33

回答

4

如果沒有調用dealloc,你仍然可以保留你的UIViewControllers。

也許你在這些UIViewControllers中設置了代表或其他類,它們保留並引用了備份樹(循環引用)。

你可以調試的方法是在你的UIViewController中重載保留和釋放,並設置一個斷點並記錄retainCount。

這是一段神奇的片段,當我無法弄清楚爲什麼我仍然保留着某些東西時,它會幫助我渡過難關。

- (id)retain 
{ 
    NSLog(@"retain \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super retain]; 
} 
- (void)release 
{ 
    NSLog(@"release \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    [super release]; 
} 
- (id)autorelease 
{ 
    NSLog(@"autorelease \t%s \tretainCount: %i", __PRETTY_FUNCTION__ , [self retainCount]); 
    return [super autorelease]; 
} 

__PRETTY_FUNCTION__是鐺的特殊隱藏宏給出了一個漂亮的Objective-C函數名作爲字符數組。

0
  1. 當iOS開始用盡內存時,它會嘗試終止使用最多內存的後臺進程。所以雖然沒有絕對的好數字,但最小化你使用多少內存是個好主意。將它保留在30Mb等於保證你的應用程序將被殺死
  2. 除非你想改變你的UI,否則不需要使用其他的UINavigationController來處理你的後退按鈕。我覺得這裏的問題是,如果dealloc不叫上彈出或關閉,你有內存泄漏

幾乎所有的視圖控制器已經被有效地緩存和數據可以再生,當應用程序返回到前臺。考慮一下你在應用程序運行時遇到內存警告時釋放的數據。 (你正在迴應內存警告,對吧?)這是當你進入後臺時應該釋放的東西。