消息通过框架代码发送到解除分配的UITableViewController对象的消息

时间:2011-10-31 17:56:33

标签: iphone ios xcode core-data uitableview

我正在开发我的第一个iPhone应用程序几个月,现在我卡在一个内存错误“消息发送到解除分配的实例”。我已经记下了我的所有观察结果(来自调试器),但找不到原因。我真的很感激任何帮助。

状况:

我创建了pick_ListBrowseController,它是UITableViewController的子类。 它被调用以从滚动列表中选择一个项目。提供的对象来自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 SCENARIO A:

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

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

步骤3)当我尝试选择一个项目时,我收到错误消息:

  

[pick_ListBrowseController controllerDidChangeContent:]:发送的消息   解除分配实例0x729b950。

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

BUG SCENERIO B:

更糟糕的是,即使在STEP 1中也会发生这种情况。)我调用了一个不同的控制器对象,也是UITableViewController的子类。步骤2)和3)保持不变。出现相同的错误,在调试器中我可以看到即使现在{1}}从步骤1发送到对象。因此,它不仅被发送到错误的(和解除分配的)对象,甚至被发送到来自不同类的对象!

问题:

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

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

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

任何帮助都将受到高度赞赏。

1 个答案:

答案 0 :(得分:2)

当您的VC被解除密钥时,您的FRC可能不会被释放。如果它闲逛并将你的VC作为代表的引用,那么你有一个悬空指针。仔细检查您是否正在清理FRC。