2011-01-12 86 views
2

我的應用程序中有一個顯示UITableView的視圖。該視圖是在一個nib文件中創建的,並具有一個自定義視圖控制器。該視圖的UIViewController子類充當UITableView的數據源和委託。UIViewController -dealloc在關閉模態視圖控制器後調用

我的UITableView根據我的數據顯示了幾行。然後,最後一行顯示不同的文本:「添加另一個...」。如果最後一行被選中,我會提供一個模態視圖控制器(以允許用戶添加更多數據)。當我解散模態視圖控制器時,我再次看到原始視圖(如預期的那樣),並且看起來都很好。但是,當我嘗試與此視圖交互時,應用程序崩潰。

通過放置幾個NSLog()語句通過UIViewController(對於UITableView),我確定在模式視圖關閉之後調用-dealloc方法。這解釋了當我試圖用這種觀點做某事時的崩潰。不過,我不知道爲什麼-dealloc在這個視圖控制器上被調用。

要關閉模態視圖控制器,我有:

[self dismissModalViewController:YES]; 

如在模態視圖控制器的UIViewController的IBAction爲方法的代碼。此操作綁定到相應的nib文件中的取消按鈕。

另外,我對View Controller Programming Guide的理解是,可以從內部解除模態控制器,但使用代表更加穩健。我最初使用的是一個委託,但委託出去簡化調試。我只是將委託放回來進行仔細檢查,並且在使用委託時會發生相同的行爲。模態控制器的動作方法調用是這樣實現的:

[[self delegate] myModalViewController:self didAddObject:obj]; 

父視圖控制器的委託實現:

[self dismissModalViewController:YES] 

如果有人見過這個或有什麼可能會發生任何建議或如何調試,我將不勝感激。

+0

你的意思是父視圖控制器是被釋放的? – BoltClock 2011-01-12 19:47:35

+0

是的,沒錯。 – jmac 2011-01-12 20:32:59

回答

6

如果調用了-dealloc,則會釋放視圖控制器。嘗試在您的視圖控制器實現-release

-(void)release { 
    NSLog(@"view controller released"); 
    [super release]; 
} 

,這樣就可以使用調試器這個意外釋放消息發生在檢查調用堆棧。

3

如果你沒有保留在其他地方,它會從模態視圖控制器本身調用dismissModalViewController這個危險(消息將被轉發給父視圖控制器)。通常,父視圖控制器負責解除它所呈現的模式視圖控制器。

+0

我已更新我的原始帖子以解決此問題。 – jmac 2011-01-12 20:46:03

相關問題