1

我有A UINavigationController以及表視圖。因爲它是選擇列表中的項目時的標準行爲,所以我將一個customViewController推送到UINavigationControllerCustomView出現,我在標題欄中看到我的後退按鈕。我應該實現哪些功能來清理UINavigationController的視圖

我的問題是,當我點擊標題欄中的後退按鈕導航到我的列表時,我會執行什麼功能來確保在customViewController中創建的所有內容都被完全銷燬並從內存中刪除?

我試圖把我的清理代碼放在自定義控制器的viewdidunload方法中,但是當我點擊後退按鈕時甚至不會進入。

(還有我不是真的知道如何詞組這個問題,因此建議,歡迎)

回答

0

UIViewControllerviewDidUnload方法似乎是一個好地方,做內存清理,即釋放可以很容易地重新創建的所有對象viewDidLoad或更高版本。

但並不保證視圖控制器本身將被釋放。 UINavigationController可能會在內部緩存對象。

+0

的viewDidUnload是我嘗試的第一個地方。我在那裏卡住了一個斷點,它不會打到 – dubbeat 2011-03-08 13:44:09

+0

哦。我沒有看到你提到,對不起:/如果viewDidUnload沒有被調用,這很奇怪... – Jilouc 2011-03-08 13:50:24

0

UINAvigationController中的已分配控制器將被自動刪除。如果您只需要讓一個人活着,那麼每次需要轉到詳細信息視圖時,都需要在導航控制器中全局創建詳細信息控制器,以便您始終使用相同的控制器。當通過方法viewDidDisappear按下後退按鈕時,您可以清除它。

0

蘋果在他們的documenation(包含漂亮的圖片和所有東西!)中解釋了一切。基本上,當您顯示您使用pushViewController:animated:的視圖時,當您返回時使用popViewControllerAnimated:

使用這樣的去新的屏幕:

- (IBAction)goSomewhereButtonPressed:(id)sender { 
    SomewhereViewController *vc = [[SomewhereViewController alloc] initWithNibName:@"SomewhereView" bundle:nil]; 
    [self.navigationController pushViewController:vc animated:YES]; 
    [vc release]; 
} 

當按下BACK按鈕,將清理您的屏幕。如果需要,Apple建議您使用UINavigationControllerDelegate進行其他設置&清理。

將屏幕清理放入其控制器(SomewhereViewController)。

- (void)viewDidUnload 
{ 
    [super viewDidUnload]; 
    // Release any retained subviews of the main view. 
    // e.g. self.myOutlet = nil; 
    NSLog(@"Somewhere's viewDidUnload called"); 
} 

- (void)dealloc 
{ 
    [super dealloc]; 
    NSLog(@"Somewhere's dealloc called"); 
} 
+0

我想我的問題是dealloc函數或我的customViewCOntroller中的viewdidunload函數實際上並沒有調用....我不明白爲什麼所以我可能需要一個替代方案 – dubbeat 2011-03-08 15:35:47

+0

如果其他對象在您的控制器中仍然存在鉤子,您的控制器的viewDidUnload和dealloc方法可能不會被調用。在viewWillDisappear中添加一些日誌消息(或斷點):和/或viewDidDisappear:驗證它們是否被調用。我剛剛遇到了這個問題,因爲我啓動了一個NSTimer來定期刷新我的視圖內容;但是即使我在viewDidUnload中使其無效,計時器仍在繼續激發。我必須在viewWillDisappear中使其無效:,然後我看到了我的dealloc調用。也許你有通知持有你的控制器? – Dave 2011-03-13 22:59:25

0

我總是把我清理代碼的dealloc:

-(void)dealloc { 
    // cleanup code here 
    [super dealloc]; 
} 
+0

由於某種奇怪的原因,我的dealloc沒有被執行。我想我不得不從didpopitem方法手動調用它,但這並不理想。 – dubbeat 2011-03-08 15:52:55

+0

確保在控制器被推入導航控制器堆棧後釋放控制器。導航控制器將保留它直到彈出。 – chris 2011-03-10 13:07:20

相關問題