2010-11-18 35 views
2

我創建的應用程序使用UITabBarController作爲主要的導航形式,在我遇到一些問題之前從未做過此操作。UITabBarController在內存警告後解除分配視圖

在四個選項卡中的兩個選項卡上,視圖控制器使用標準導航控制器持續鑽取並瀏覽類別,然後瀏覽到項目中,類別和項目具有不少圖像。

使用我的應用程序(跌到哪裏使用的4倍320x460的圖像滾動型的項目階段),我得到的幾分鐘後..

Received memory warning. Level=1 

這就DEALLOCATE一切都該視圖的的目前持有我UITabBarController,當我點擊標籤時,我只出現白色屏幕。

當使用圖像時,我試圖用..

UIImageView *imageView = [[[UIImageView alloc] init] autorelease]; 
[imageView setImage:[UIImage imageNamed:@"image"]]; 
[self.view addSubview:imageView]; 

..as儘量據我所知,這是「內存管理」,而應該正確的dealloc。

我相信內存問題僅僅是由於4個大圖像被加載到內存中引起的,這是我的應用程序的一個要求。該標籤的消失不是:/

任何想法/指導?

+0

我相信你誤解viewDidLoad中和viewDidUnload的價值。此外,您應該始終以任何方式擺脫自動釋放池並執行手動保留/釋放計數管理。在你的情況下,它很容易:UIImageView * imageView = [[UIImageView alloc] init]; [imageView setImage:[UIImage imageNamed:@「image」]]; [self.view addSubview:imageView]; [imageView發佈]; – 2010-11-18 17:03:52

回答

3

這是設計。當您的應用程序收到內存警告時,當前不可見的所有視圖控制器都將卸載其視圖。你必須爲此做好準備。當用戶重新打開卸載的選項卡時,視圖控制器將重新加載視圖,並再次調用-viewDidLoad,您應該在其中執行視圖設置。

+0

謝謝你,當我知道答案的時候,很簡單!謝謝你幫我看到樹人的木頭。 – Bongeh 2010-11-23 09:25:04

+0

如果視圖是從XIB加載的呢?那麼在之前調用viewDidLoad時可能分配的所有對象又如何?如果您重新執行所有這些分配,您將泄漏所有先前的實例。 – Oscar 2012-02-09 09:28:27

+0

@Oscar:NIB或不是沒有區別。這個過程是完全一樣的。爲了不浪費或泄漏內存,您必須釋放您在'viewDidUnload'方法中的'viewDidLoad'中分配/保留的所有內容。文檔詳細描述了這一點。 – 2012-02-09 11:04:26

1

奧列給了一個體面的解釋。有一件事,如果你的屏幕外視圖控制器的視圖被卸載了,你應該在-loadView中重新設置它。 調用此方法來設置視圖層次結構,然後調用-viewDidLoad以表示視圖已準備就緒。 如果您在-viewDidLoad中實現它,您將加載一個空視圖(UIViewController -loadView),然後替換(使用您的-viewDidLoad代碼),導致閃爍。

一個甚至有關裝入你的意見更詳細的解釋,請訪問:http://myok12.wordpress.com/2010/11/30/custom-uiviewcontrollers-their-views-and-their-memory-management/

+0

但是,如果屏幕從XIB加載,則不會覆蓋loadView。 – Oscar 2012-03-06 19:11:34

相關問題