【发布时间】:2010-09-18 15:35:54
【问题描述】:
我有一个 TabView 应用程序,其中一个选项卡有一个 NavView 作为它的视图之一。这个视图有一个带有 TableView 的子视图来保存事件。我已启用导航栏右上角的“添加”按钮并将 IBAction 分配给该按钮。
目标是显示一个页面以添加一个新事件,该事件由我实例化子类控制器类的实例时加载的 NIB 文件定义。我还从父导航控制器传递了 managedObjectContext。
这第一次有效,但第二次按下“添加”按钮时出现 EXC_BAD_ACCESS 错误。我已经调试到将控制器推送到导航控制器上,并且我已经确认这是发生异常的地方。我已经阅读了文档,它说导航控制器将通过点击导航栏顶部提供的“后退”按钮来弹出控制器。我也知道,如果我尝试将相同的视图推送到堆栈上,将会发生未处理的异常。我什至尝试在推送之前弹回 root 以清除堆栈,但第二次推送时仍然出现异常。
我是否应该在其他地方手动弹出这个(即导航“返回”按钮实际上并没有弹出这个)?我还确认导航控制器和新实例化的视图控制器的实例都不为空。
这是添加按钮的代码 sn-p:
- (IBAction) addEvent: (id)sender {
// Here we'd instantiate an instance of our Add Event Controller to show the form that allows us to enter a new event.
// We'd add the context to the class from here so that it can get to our Core Data
EventEntryViewController *fvController = [[EventEntryViewController alloc] initWithNibName:@"AddEventView" bundle:nil];
fvController.managedObjectContext = self.managedObjectContext;
[self.navigationController pushViewController:fvController animated:YES];
[fvController release];
fvController = nil;
}
感谢您的帮助。
更新:
好的,我已经阻止了异常的发生。我尝试了一个非常简单的视图,其中没有任何内容,没有 IBOutlets 或 IBActions 以及一个没有属性的控制器类。那行得通,所以我认为这一定是我的 EventEntryViewController 的问题。它并没有做太多事情,并且回溯显示它在显示视图的内部正在死去,所以我什至没有进入 loadView 方法,更不用说我的代码的任何其他部分了。我有一些在上一次加载中已经初始化的类属性,作为一个好公民,我在 viewDidUnload() 中释放了它们,并在 dealloc() 中释放了它们。当我注释掉我的类属性的 dealloc 时,它起作用了!
我对此感到困惑,并将 NSLog() 行放在 viewDidLoad()、viewDidUnload() 和 dalloc() 中。这是我取出类属性的 dalloc 后两个推送序列的结果:
2010-09-18 20:17:46.224 myFuel[6435:207] EventTableNavViewController: viewDidAppear
2010-09-18 20:17:51.391 myFuel[6435:207] **EventEntryViewController**: View Did Load // loading up my class
2010-09-18 20:17:53.954 myFuel[6435:207] EventTableNavViewController: viewWillAppear
2010-09-18 20:17:54.314 myFuel[6435:207] EventTableNavViewController: viewDidAppear
2010-09-18 20:17:54.315 myFuel[6435:207] **EventEntryViewController**: dalloc // after the class should have been popped
2010-09-18 20:18:02.803 myFuel[6435:207] **EventEntryViewController**: View Did Load //loading up my class
2010-09-18 20:18:08.134 myFuel[6435:207] EventTableNavViewController: viewWillAppear
2010-09-18 20:18:08.494 myFuel[6435:207] EventTableNavViewController: viewDidAppear
2010-09-18 20:18:08.495 myFuel[6435:207] **EventEntryViewController**: dalloc // after the class should have been popped
我在这里遗漏了什么吗?视图不应该调用 viewDidUnload() 从而释放类属性吗?我可以看到 dealloc 被调用,但我在哪里释放这些?
【问题讨论】:
标签: uinavigationcontroller ios exc-bad-access