Iphone Can';t在Dealoc中释放NSFetchedResultsController
我有两个UITableViewController,具有相当简单的ui流。在第一个UITableViewController中选择项目时,一个UITableViewController将加载另一个UITableViewControllerIphone Can';t在Dealoc中释放NSFetchedResultsController,iphone,cocoa-touch,core-data,release-management,nsfetchedresultscontroller,Iphone,Cocoa Touch,Core Data,Release Management,Nsfetchedresultscontroller,我有两个UITableViewController,具有相当简单的ui流。在第一个UITableViewController中选择项目时,一个UITableViewController将加载另一个UITableViewController (UITableViewController)故事列表->选择故事->(UITableViewController)句子列表 在第二个UITableViewController(MakeSentenceDetailViewController)中,我无法释
(UITableViewController)故事列表->选择故事->(UITableViewController)句子列表
在第二个UITableViewController(MakeSentenceDetailViewController)中,我无法释放我的NSFetchedResultsController而不会导致错误(显示为Zombies设置为on): -[NSFetchRequest release]:发送到解除分配实例0x5b370f0的消息 NSFetchedResultsController的保留计数保持为1,但当我尝试在dealloc中释放它时,会发生崩溃 代码,特别是关于NSFetchedResultsController的代码在两个表视图中都是相同的,但在MakeSentenceDetailViewController中,我无法释放此NSFetchedResults控制器并导致崩溃,这给了我一个漏洞 如何安全地释放NSFetchedResultsController?为什么它在父(第一个)tableviewcontroller中工作良好,但在第二个中却不工作 我可以为第一个UITableViewController提供代码,但对于NSFetchedResultsController,它的声明和使用方式基本相同 MakeSentenceTableViewController.h:
@interface MakeSentenceTableViewController : UITableViewController {
NSManagedObjectContext *managedObjectContext;
NSFetchedResultsController *fetchedResultsController;
}
@property (nonatomic, retain) Story *story;
@property (nonatomic, retain) NSManagedObjectContext *managedObjectContext;
@end
MakeSentenceTableViewController.m(与NSFetchedResultsController相关的代码):
您正在释放已放弃所有权的对象(使用
-autorelease
)。在另一个版本中不会出现错误,因为NSFetchedResultsController也保留了提取请求;因此,当控制器释放对提取请求的最后一个引用时,它实际上是导致崩溃的控制器。您过度释放了NSFetchRequest
您可以在此处自动释放它:
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
然后稍后再次释放:
[request release];
然后,当您稍后释放fetchedResultsController时,它会再次尝试释放相同的请求。谢谢-这解决了问题,但也会创建(或显示)另一个问题。现在,我每三次进入MakeSentenceViewController(使用导航控制器在TableViewController之间切换)时,就会在这行代码上崩溃:managedObjectContext=[(MyAppAppDelegate*)[[UIApplication sharedApplication]delegate]managedObjectContext];你能看到任何明显的联系吗?它可能超出了这个问题的范围。具体取决于它是如何崩溃的。好吧,我会在下周左右做一些额外的调试-如果我找到了解决方案,我会在这里发布,如果我找不到,我会创建一个新问题。谢谢你抽出时间。
NSFetchRequest *request = [[[NSFetchRequest alloc] init] autorelease];
[request release];