【问题标题】:Bug with message sent to deallocated UITableViewController object by framework code框架代码向释放的 UITableViewController 对象发送消息的错误
【发布时间】:2011-12-18 22:46:02
【问题描述】:

我花了几个月的时间来开发我的第一个 iPhone 应用程序,现在我遇到了内存错误“发送到已释放实例的消息”。我已经写下了我所有的观察结果(来自调试器),但找不到原因。我将非常感谢任何帮助。

情况:

我创建了 UITableViewController 的子类 pick_ListBrowseController。 调用它从滚动列表中选择一个项目。呈现的对象来自 CareData 数据库。 我用NSFetchedResultsController

在pick_ListBrowseController的实现中,有一个典型的方法返回一个获取的结果控制器:

- (NSFetchedResultsController *) fetchedResultsController {

  // If the fetched results controller already exists, return it:
     if (fetchedResultsController != nil) { return fetchedResultsController;}   

  (…) // constructing fetchRequest object with entity and sort descriptors

  [NSFetchedResultsController deleteCacheWithName:@"pick_List"];

  // Create fetched request controller:
  NSFetchedResultsController *aFetchedResultsController = 
  [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
            managedObjectContext:self.managedObjectContext 
            sectionNameKeyPath:nil cacheName:@"pick_List"]; 
  // Set the fetched results controller's delegate to self;
  //  it will send controllerDidChangeContent:
       [aFetchedResultsController setDelegate: self]; 
  // Assign this new fetched results controller to the property:
   [self setFetchedResultsController: aFetchedResultsController];
  // Return fetched request controller:
  return fetchedResultsController;
}   

BUG 场景 A:

步骤 1) 我调用我的 pick_ListBrowseController,选择一个项目并返回。视图消失。 在调试器中,我可以看到 pick_ListBrowseController 对象的内存地址为 0x729b950

步骤 2) 我再次调用 pick_ListBrowseController。现在是另一个实例,内存地址为 0x755a4e0

第 3 步)当我尝试挑选物品时,我收到错误消息:

[pick_ListBrowseController controllerDidChangeContent:]:消息发送 到释放的实例 0x729b950。

地址来自步骤 1) !出于某种原因,框架代码(我无法访问)将controllerDidChangeContent: 从 STEP 1) 发送到已释放的对象,而不是从 STEP 2) 发送到对象。

BUG 场景 B:

更糟糕的是,即使在第 1 步)我调用了一个不同的控制器对象,它也是 UITableViewController 的子类。步骤 2) 和 3) 保持不变。发生了同样的错误,在调试器中我可以看到即使现在controllerDidChangeContent: 已从步骤 1 发送到对象)。因此,它不仅被发送到错误(并被释放)的对象,甚至被发送到来自不同类的对象!

问题:

1) 可能是什么原因?如何解决?

2) 我的应用真的很大。它是否可能变得太大而导致上述内存问题?如果是,我该怎么做才能把事情做好?

目前,我使用 Xcode 版本 4.2 build 4C199 并使用自动引用计数 (ARC) - 我经历了重构过程“转换为 Objective-C ARC”。

我们将不胜感激。

【问题讨论】:

    标签: iphone ios xcode core-data uitableview


    【解决方案1】:

    当你的 VC 被释放时,你的 FRC 很可能没有被释放。如果它挂在附近并且有你的 VC 作为对委托的引用,那么你有一个悬空指针。仔细检查您是否正在清理 FRC。

    【讨论】:

    • 谢谢。但请告诉我清理 FRC 的命令(我使用自动引用计数 - ARC)。
    • 即使在 ARC 下,你的保留属性也必须在 dealloc 方法中设置为 nil。
    • 就是这样!现在,我做了以下事情:在所有代码中,我在 dealloc 方法中将 nil 设置为所有具有(强)属性的@properties(在转换为 ARC 之前,它们具有(保留)属性)。现在,该错误以及其他一些错误都消失了,原因相同。我的应用程序再次稳定。非常感谢 logancautrell,你真的救了我!!
    猜你喜欢
    • 1970-01-01
    • 2010-12-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多