2011-01-12 84 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

相关问题