我有一个试图推送到导航堆栈的 View Controller 。我使用局部变量创建 Controller ,对其进行设置,然后将其分配给属性。然后,如果我释放变量,我会得到 EXE_BAD_ACCESS。如果我保留(或自动释放)它会泄漏。
CustomTVC* controller = [[CustomTVC alloc]initWithStyle:UITableViewStyleGrouped];
controller.managedObjectContext = self.managedObjectContext;
self.tableViewControllerIvar = controller;
[self.navigationController pushViewController:self.tableViewControllerIvar animated:YES];
//[controller autorelease]; or [controller release]; or nothing
这就是如果我释放会发生什么
- 上面的代码是通过按下导航栏中的添加按钮触发的。
- View 已推送,一切正常。在新 View 中,我可以毫无问题地一遍又一遍地推送更多 View ...除非
- 我回到导航堆栈的 Root View 。 (这是上面代码的来源)。
- 现在,如果我再次向下钻取到第二个 View ,然后尝试推送另一个 View ,它就会崩溃。
编辑:当我将第三个 Controller 插入堆栈时,我感觉出了问题。通过推送,它将一个新对象插入到托管对象上下文中,这导致 fetchedresultscontroller 更新 TableView 。某处可能有一个损坏的指针。我会玩它并发布结果。 –
编辑:5/16
在日志中获取此错误消息
* -[CustomTVC controllerWillChangeContent:]: message sent to deallocated instance 0x187270
这只会在我从堆栈中弹出 CustomTVC(返回到导航 Root View Controller )后发生,只要我不弹出 CustomTVC,我就可以推送并保存我想要的所有内容。
最佳答案
已修复。必须在 viewDidLoad 中将获取的结果 Controller 委托(delegate)设置为 nil。
- (void)dealloc
{
self.fetchedResultsController.delegate = nil;
[_fetchedResultsController release];
[_managedObjectContext release];
[super dealloc];
}
似乎罪魁祸首是(根据僵尸仪器):
[NSFetchedResultsController(私有(private)方法) _managedObjectContextDidChange:]
Edit(s):终于花时间弄清楚如何正确地将代码放在这里(我很懒)
关于iphone - 如果我释放,我将无法访问,如果我保留,我将泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6006028/