2010-11-29 65 views
1

我的iPhone應用程序基於常見的「實用程序模板」,如蘋果自己的天氣應用程序。多次加載iPhone視圖...但從未卸載過?

我點擊信息按鈕,它翻轉屏幕。我點擊我的完成按鈕...然後翻轉。這部分似乎都工作正常。

我已經放置的NSLog()語句到每一個的4種方法在我FlipSideViewController.m

viewDidLoad 
viewWillAppear 
viewDidUnload 
viewWillDisappear 

我不應該看到的viewDidLoad和viewDidAppear當我翻到我的另一面被調用。 然後當我翻轉時再看到viewWillDisappear和viewDidUnload?

相反,我從來沒有看到任何viewDidUnload調用。但每次我翻到我的FlipSide時,我都會看到另一個viewDidLoad。這是錯的?

來回翻轉,一遍又一遍,我會看到:

viewDidLoad 
viewWillAppear 
viewWillDisappear 

viewDidLoad 
viewWillAppear 
viewWillDisappear 

viewDidLoad 
viewWillAppear 
viewWillDisappear 

難道這不是意味着視圖重載3次......但卸載0次? 不應該有「匹配」加載/卸載和出現/消失方法在這裏發生?

+1

你可以發佈你的翻轉效果的代碼?我認爲你不應該像你應該去除視圖。 – vincent 2010-11-29 18:13:42

回答

7

我一開始也這麼想,但顯然情況並非如此。

viewDidUnload方法實際上只有在視圖控制器收到內存警告時才被調用。

儘管如此,當視圖控制器被解除分配時,視圖將被釋放。

所以,如果你是在viewDidUnload釋放的東西一樣IB網點,這很好,但你必須釋放他們在dealloc爲好,因爲viewDidUnload不會在正常情況下(即調用,如果你沒有得到記憶警告)。

編輯: 釋放view你只需要在你的dealloc調用dealloc的超類UIViewController

- (void) dealloc 
{ 
    // release your stuff, anything that you alloc or retain in your class 

    // then call `dealloc` on the super class: 
    [super dealloc]; 
} 

viewDidUnload方法,你只需要發佈的東西,應該讓沿卸載您查看,通常是您在界面構建器中連接到IBOutlet的東西。

- (void) viewDidUnload 
{ 
    // if the property was declared with the "retain" keyword, you can 
    // release it simply by setting it to nil like this: 
    self.myOutlet = nil; 
} 
+0

值得注意的是,重複使用* same *視圖控制器(即,不釋放它)將導致更經常地調用viewDidUnload,因爲視圖控制器本身仍然存在,但視圖可能不在屏幕上因此應用程序可以卸載它)。 – 2010-11-29 19:00:20