iphone - 如果我释放,我将无法访问,如果我保留,我将泄漏

标签 iphone objective-c cocoa-touch

我有一个试图推送到导航堆栈的 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

这就是如果我释放会发生什么

  1. 上面的代码是通过按下导航栏中的添加按钮触发的。
  2. View 已推送,一切正常。在新 View 中,我可以毫无问题地一遍又一遍地推送更多 View ...除非
  3. 我回到导航堆栈的 Root View 。 (这是上面代码的来源)。
  4. 现在,如果我再次向下钻取到第二个 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/

相关文章:

iphone - 如何按 NSString 长度对 NSMutableArray 进行排序?

objective-c - 2x 图像不适用于 Retina 设备

ios - 将 UINavigationBar 添加到以模态方式呈现的 TableViewController 中?

iphone - 将点从图像转换为 UIImageView 点,contentMode-aware

ios - 从服务器获取@2x 和@3x 的图像

iphone - 如何在 iOS Gamecenter match.participants 中找到已满的座位?

ios - 当我单击 uitableview 单元格时,该单元格的文本变得更粗?

ios - 将核心数据与数据库同步-更新记录非常慢

objective-c - NSArrayController绑定(bind): Suppress "No selection"

iphone - 我可以在iTunes Connect的哪个位置上传大图像图标?