2011-02-02 80 views
0

如果我有2個控制器;列表和詳細信息控制器,處理這兩個控制器的內存管理的正確方法是什麼?列表和詳細控制器

我的意思是在什麼時候應該釋放他們被稱爲?

情況下也我的名單控制器是動態的(即數據被從內線Web服務調用)和一些數據傳遞到細節控制器,確切位置在哪裏我應該寫的代碼來檢索/詳細顯示控制器的數據。我的意思是應該是viewDidLoad或viewWillAppear?

任何例子都會很棒。

回答

0

沒有單一的答案。但我的答案是.... viewWillAppear

就拿這幾乎是從來沒有使用過的細節圖。所以,也許你每次使用它時都會決定創建一個,並在每次使用後將其銷燬。

拿另一個可能經常使用的細節視圖。您決定創建一次,然後重新使用它。也許你甚至會在低內存警告中銷燬它,並在下次使用時重新創建它。在這種情況下,你不能依靠viewDidLoad被稱爲每次

使用viewWillAppear使我的代碼更一致,更使得它更容易做出改變時,我意識到,細節視圖被稱爲比我預期的多很多。我應該重新使用它,而不是每次都創建它。

至於什麼時候應該釋放他們...這真的取決於視角。它多久使用一次?簡單地存在多少內存?重新創建需要多少工作?

+0

在viewDidLoad中的情況下(當用戶導航回&所述LC&DC之間),是viewDidLoad中稱爲每次或如果有一些時間間隙? – testndtv 2011-02-02 18:29:40

0

從我的經驗,以istantiate詳細視圖控制器的最佳方式是:

MyDetailController * dc = [[MyDetailController alloc] initWithMyObject: anObject]; 
[self.navigationController pushViewController: dc animated: YES]; 
[dc release]; 

這裏anObject是要存在於細節視圖控制器片下載的數據。

我假設你的名單控制器是程序的主要原因之一,這應該是實例如下:

- (BOOL) application: (UIApplication *) application didFinishLaunchingWithOptions: (NSDictionary *) launchOptions { 
_baseWindow = [[UIWindow alloc] initWithFrame: [[UIScreen mainScreen] bounds]]; 
_listVC = [MyListController new]; 
[_baseWindow addSubview: _listVC.view]; 
[_baseWindow makeKeyAndVisible]; 
return YES; 
} 

併發布:

- (void) dealloc { 
[_listVC release]; _listVC = nil; 
[_baseWindow release]; _baseWindow = nil; 
[super dealloc]; 
} 

記住-viewDidLoad之後-loadView稱爲,當有人試圖訪問視圖控制器的-view屬性時,它又被調用。

因此,你可能要準備在-viewDidLoad視圖並做-viewWillAppear或-viewDidAppear一些額外的任務。請注意,-viewWillAppear(以及類似的方法)被稱爲EVERY TIME,其視圖控制器的視圖顯示在屏幕上。也就是說,例如,如果您從細節vc中推入另一個VC,然後彈出,則會再次調用-viewDidAppear。