【发布时间】: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