Iphone Can';t在Dealoc中释放NSFetchedResultsController

Iphone 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,具有相当简单的ui流。在第一个UITableViewController中选择项目时,一个UITableViewController将加载另一个UITableViewController


(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];