【问题标题】:Core Data: Fetched Results Controller causing over release/crash核心数据:获取结果控制器导致过度发布/崩溃
【发布时间】:2011-11-18 06:43:42
【问题描述】:

我正在使用core data,并且有一个UITableViewController,它从core data 加载数据。这是modal view,如果我第三次加载模态视图,它会因EXC_BAD_ACCESS 而崩溃。

- (NSFetchedResultsController *)fetchedResultsController {

    if (fetchedResultsController != nil) {
        return fetchedResultsController;
    }

    // Create and configure a fetch request
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Ride" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];

    // Create the sort descriptors array
    NSSortDescriptor *sectionTitle = [[NSSortDescriptor alloc] initWithKey:@"dateStart" ascending:NO];
    NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sectionTitle, nil];
    [fetchRequest setSortDescriptors:sortDescriptors];

    // Create and initialize the fetch results controller
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    self.fetchedResultsController = aFetchedResultsController;
    fetchedResultsController.delegate = self;

    // Memory management
    [aFetchedResultsController release];
    [fetchRequest release];
    [sectionTitle release];
    [sortDescriptors release];

    return fetchedResultsController;

}//end

崩溃表明它来自这一行:

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_BAD_ACCESS 的堆栈跟踪:

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

【问题讨论】:

  • 这段代码看起来不错,但还有其他事情发生。如果您认为它与多次显示模态视图有关,请检查以确保在模态视图被关闭时没有任何内容保留。在战略位置添加一些 NSLog 语句并查看对象 ID 以帮助了解发生了什么。
  • 我只是使用 [self dismissModalViewControllerAnimated:YES] 将其关闭,这是一个坏主意吗?我知道苹果有时会做不同的事情。我没有看到任何其他可能导致这种情况的东西......但我更新了我的代码与我呈现和解雇的方式。
  • 你能发布崩溃和堆栈跟踪吗?
  • 发布了我在崩溃时遇到的堆栈跟踪。
  • 您是否在 Xcode 运行方案中启用了 Zombie Objects 以获得有关 EXC_BAD_ACCESS 的更明确信息

标签: objective-c ios core-data nsfetchedresultscontroller nsentitydescription


【解决方案1】:

好的,我想通了,我的 managedObjectContext 没有被保留,因为我没有使用 self.所以,我通过这样做来修复它:

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

【讨论】:

  • 我会重申你的答案。你的上下文没有被保留 b/c 当你分配它时你没有保留它。通过使用合成的设置器(例如self.managedObjectContext = ...),它会被保留。还有其他方法可以确保您拥有有效的上下文。您可以手动保留它而无需设置器,或者您可以直接引用 appDelegate 上下文而无需将其存储在 iVar 中。我添加此评论是为了(希望)帮助您理解问题和对象关系。
  • 我建议您查看 XCode 4.2 中提供的自动引用计数 (ARC)。 ARC 让编译器完成几乎所有工作,以确保正确保留/释放对象。
  • 我个人不喜欢使用 ARC 的想法,因为我认为它会导致成为一个懒惰的程序员。不想说别人错了,但这只是我的看法。
  • 没关系,你有权发表你的意见。就个人而言,我喜欢它。恕我直言,这对编译器来说是一项完美的工作,让我们的程序员可以解放我们的应用程序,而不是浪费时间调试愚蠢的对象分配错误。我是理解对象生命周期的坚定拥护者,但我很高兴将我的编码时间花在其他事情上。
猜你喜欢
  • 1970-01-01
  • 2018-09-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多