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

jma*_*mac 2 iphone uiviewcontroller

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

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

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

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

[self dismissModalViewController:YES];
Run Code Online (Sandbox Code Playgroud)

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

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

[[self delegate] myModalViewController:self didAddObject:obj];  
Run Code Online (Sandbox Code Playgroud)

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

[self dismissModalViewController:YES]
Run Code Online (Sandbox Code Playgroud)

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

Sea*_*ell 6

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

-(void)release {
    NSLog(@"view controller released");
    [super release];
}
Run Code Online (Sandbox Code Playgroud)

这样,您可以使用调试器在发生此意外释放消息时检查调用堆栈.

  • ARC可以使用什么而不是发布? (2认同)