UIViewController -dealloc在解除模态视图控制器后被调用

时间:2011-01-12 19:24:27

标签: iphone uiviewcontroller

我的应用中有一个显示UITableView的视图。此视图在nib文件中创建,并具有自定义视图控制器。此视图的UIViewController子类充当UITableView的数据源和委托。

我的UITableView根据我的数据显示多行。然后,最后一行显示不同的文本:“添加另一个...”。如果选择了最后一行,我会提供一个模态视图控制器(允许用户添加更多数据)。当我关闭模态视图控制器时,我再次看到原始视图(如预期的那样)并且看起来都很好。但是,当我尝试与此视图进行交互时,应用程序崩溃了。

通过UIViewController(对于UITableView)放置几个NSLog()语句,我已经确定在模式视图被解除后正在调用-dealloc方法。这解释了当我尝试使用该视图执行某些操作时的崩溃。但是,我不知道为什么在这个视图控制器上调用-dealloc。

要解雇模态视图控制器,我有:

[self dismissModalViewController:YES];

作为模态视图控制器的UIViewController中的IBAction方法中的代码。此操作与相应nib文件中的取消按钮相关联。

此外,我对View Controller Programming Guide的理解是,可以从内部解除模态控制器,但使用委托更加健壮。我最初使用的是委托,但是委托代理来简化调试。我只是让代理重新进行仔细检查,使用委托时会出现相同的行为。模态控制器的动作方法调用实现为:

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

父视图控制器中的委托实现是:

[self dismissModalViewController:YES]

如果有人之前已经看过这个,或者对可能发生的事情有什么建议或如何调试,我会非常感激。

2 个答案:

答案 0 :(得分:6)

如果正在调用-dealloc,则会释放视图控制器。尝试在视图控制器中实现-release

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

以便在发生此意外释放消息时可以使用调试器检查调用堆栈。

答案 1 :(得分:3)

如果你没有在其他地方保留它,那么从模态视图控制器本身调用dismissModalViewController会很危险(消息将被转发到父视图控制器)。通常,父视图控制器负责解除它所呈现的模态视图控制器。