2011-07-31 67 views
0

我有一個基於導航的應用程序。屏幕列表有一個UITableView與書籍清單。書籍列表位於通過執行HTTP請求動態構建的屬性NSArray中。當您點擊列表中的某一行時,您將導航至屏幕詳情。假設此時存在內存警告。當您回到屏幕列表時,NSArray爲零,因爲viewDidUnload被調用,所以列表將爲空。iOS內存管理 - viewDidUnload

處理這種情況的正確方法是什麼?我不應該在viewDidUnload中將NSArray設置爲零嗎?

回答

1

通常,您只會刪除IBOutlet UI元素的屬性。您還可以安全地清理任何可以在-viewDidLoad中重新創建的內容。但一般來說,這種方法僅用於清理和釋放與視圖相關的內存,而不是視圖控制器。

+0

所以,簡單的答案是,我不應該設置的NSArray到零,對吧?這是否意味着NSArray只會在應用程序結束時纔會發佈? – Adriana

+0

更正第一個問題。數組將在視圖控制器被銷燬時釋放(假設你已經在'-dealloc'中釋放它)。如果視圖控制器始終位於導航控制器的堆棧中,那麼陣列將繼續存在,直到應用完成。 –

+0

我在我的UIViewController子類的' - (void)dealloc'方法中調用'[super dealloc]',所以視圖控制器被銷燬了,對嗎?最後一個問題:我不應該在我的模型中定義' - (void)dealloc'方法,對吧?否則,如果有內存警告,數據將會丟失,我猜...謝謝你的明確說明:) – Adriana

0

正確的方法是不存儲在一個UIViewController您的數據,但在管理您的數據的另一個對象。

viewcontroller作爲您的模型和屏幕之間的鏈接。你不應該用它來存儲你的數據。

+0

我不確定這是否是相關建議 - 無論數據在哪裏「存儲」,都至少需要在視圖控制器中對其進行引用。對於未保留的瞬態數據,數據存儲在堆上。 Adriana沒有指定模型類是否被用來抽象獲取或者它是否在模型類中執行。 –

+0

問題的提出方式(以及它的實際情況)只是給了我一種直覺,即數據被提取並存儲在viewcontroller中。我經常遇到這種代碼。稱它爲有教養的猜測;) –

+0

即使它是,它也沒有解決被問到的問題。 –

0

一般我設置在空隙的dealloc對象的NS(可變)陣列()。 無和釋放(如果對象不是自動釋放)。

如果您使用的UINavigationController,視圖推,因此,當您從您的詳細視圖退回,通常你有你自己以前的數據,除非你把viewWillAppear中刷新。

我的猜測是,你必須釋放從http請求的內存出現問題。

0

如果陣列是建立在viewDidLoad中節,那麼你可以將其設置爲零。當視圖被召回時,它將被重建。

通常你想設置什麼零在既可以在viewDidLoad中部分或XIB文件來重建viewDidUnload。

我會建議延遲初始化雖然這樣的 -

- (NSArray *)bookArray { 
    if (bookArray == nil) { 
     bookArray = [[NSArray alloc] init]; 
    } 
    return bookArray; 
} 

然後在viewDidLoad中:

self.bookArray = [NSArray arrayWithOjects:...,nil];