我正在开发我的第一个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”。
任何帮助都将受到高度赞赏。
答案 0 :(得分:2)
当您的VC被解除密钥时,您的FRC可能不会被释放。如果它闲逛并将你的VC作为代表的引用,那么你有一个悬空指针。仔细检查您是否正在清理FRC。