【发布时间】:2011-11-07 20:23:24
【问题描述】:
以下是重现的步骤:
使用 Xcode 4.2 创建一个使用 Master-Detail Application
的新项目选中使用自动引用计数 (ARC)、Core Data 并选择 iPad
.
在viewDidLoad 里面放这个代码:
UIBarButtonItem *backButton = [[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(goBack)];
backButton.title = @"back";
self.navigationItem.leftBarButtonItem = backButton;
也将此方法放在其他地方:
- (void)goBack
{
[self.navigationController popViewControllerAnimated:YES];
}
在MasterViewController 上的didSelectRowAtIndexPath 中输入以下代码:
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
{
MasterViewController* master = [[MasterViewController alloc] init];
master.managedObjectContext = self.managedObjectContext;
[self.navigationController pushViewController:master animated:YES];
}
添加一行并在其中单击。
返回主视图并在项目中再次单击。
尝试在新视图中添加或删除内容会发生以下崩溃:
*** -[MasterViewController controllerWillChangeContent:]: message sent to deallocated instance 0x6d85c30
如果您不使用 ARC,则不会发生相同的步骤。
使用模态时同样的错误。
谁能确认这一点,或者我在使用 ARC 时遗漏了什么?
【问题讨论】:
-
当它崩溃时你会得到什么堆栈跟踪?
-
*** -[MasterViewController controllerWillChangeContent:]:消息发送到已释放实例 0x6d85c30
-
这种情况(虽然很奇怪)在 ARC 下运行良好。您是否进行了此处未反映的其他更改?通常,ARC 会导致任何未保留在某处的对象在运行循环结束时被释放。您的错误表明您进行了更改,将错误的 MasterViewController 分配为 fetchedResultsController 的委托,因此正在向解除分配的 Master 发送委托消息。如果您需要更多帮助,请发布更多代码。
-
不同之处在于方案编辑器中的“启用僵尸对象”选项被启用,导致该错误。很奇怪!
-
谢谢,似乎禁用僵尸对象解决了我同样的问题;)
标签: objective-c ios ipad core-data automatic-ref-counting