Objective c 核心数据:获取的结果控制器导致过度释放/崩溃

Objective c 核心数据:获取的结果控制器导致过度释放/崩溃,objective-c,ios,core-data,nsfetchedresultscontroller,nsentitydescription,Objective C,Ios,Core Data,Nsfetchedresultscontroller,Nsentitydescription,我使用的是核心数据,并且有一个UITableViewController,用于从核心数据加载数据。这是一个模态视图,如果我第三次加载模态视图,它会在EXC_BAD_访问时崩溃 飞机坠毁时说它来自这条线: NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ride" inManagedObjectContext:managedObjectContext]; 这在viewDidLoad中: if (managedO

我使用的是核心数据,并且有一个UITableViewController,用于从核心数据加载数据。这是一个模态视图,如果我第三次加载模态视图,它会在EXC_BAD_访问时崩溃

飞机坠毁时说它来自这条线:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ride" inManagedObjectContext:managedObjectContext];
这在viewDidLoad中:

if (managedObjectContext == nil) { 
        managedObjectContext = [MyAppDelegate instance].managedObjectContext; 
    }
呈现模态视图:

History *history = [[[History alloc] init] autorelease];
UINavigationController *nav = [[[UINavigationController alloc] initWithRootViewController:history] autorelease];
[self presentModalViewController:nav animated:YES];
解雇模式:

- (void)done {
    [self dismissModalViewControllerAnimated:YES];
}
给予EXC\u BAD\u访问权限的堆栈跟踪:


现在,为了使用核心数据设置此视图,我遵循了核心数据手册示例项目,我的代码看起来几乎相同。为什么在加载了几次模态视图后它会崩溃?

好的,我发现,我的managedObjectContext没有被保留,因为我没有使用self。因此,我通过以下操作修复了它:

// Core Data
if (managedObjectContext == nil) { 
    self.managedObjectContext = [MyAppDelegate instance].managedObjectContext; 
}

这段代码看起来还可以,但还有其他问题。如果您认为它与多次显示模式视图有关,请检查以确保在模式视图被取消时没有任何内容保留该视图。在战略位置添加一些NSLog语句,并查看对象ID以帮助了解发生了什么。我只是使用[self dismissModalViewControllerAnimated:YES]来忽略它,这是个坏主意吗?我知道苹果有时做得不一样。我看不到任何其他原因会导致这种情况……但我更新了我的代码,说明了我是如何提出和驳回的。你能发布崩溃和堆栈跟踪吗?发布了我在崩溃时得到的堆栈跟踪。你是否启用了Xcode运行方案中的僵尸对象,以获得有关EXC_BAD_访问的更明确信息?我将重申你的建议答复您的上下文未被保留b/c您分配上下文时未保留上下文。通过使用综合setter,例如self.managedObjectContext=。。。它正在被保留。还有其他方法可以确保您拥有有效的上下文。您可以在不使用setter的情况下手动保留它,也可以直接引用appDelegate上下文,而不将其存储在iVar中。我添加此评论是希望有助于您理解问题和对象关系。我建议您研究XCode 4.2中提供的自动引用计数弧。让我们让编译器来完成几乎所有的工作,确保对象被正确地保留/释放。我个人不喜欢使用ARC的想法,因为我认为这会导致成为一个懒惰的程序员。不要试图说别人错了,但这只是我的看法。没关系,你有权发表你的看法。就我个人而言,我喜欢它。对编译器来说,这是一项完美的工作,让我们程序员可以自由地完成应用程序的大部分工作,而不是浪费时间调试愚蠢的对象分配错误。我强烈主张理解对象的生命周期,但我很乐意把我的编码时间花在其他事情上。
// Core Data
if (managedObjectContext == nil) { 
    self.managedObjectContext = [MyAppDelegate instance].managedObjectContext; 
}