【问题标题】:A strange iPhone CORE DATA error behavior一个奇怪的 iPhone CORE DATA 错误行为
【发布时间】:2010-02-14 18:29:00
【问题描述】:

我在 Core Data 应用程序中有一个非常奇怪的行为。 这是代码:

        unaReg.valore = [NSNumber numberWithInt:val];
        NSError *error;
        if (![managedObjectContext save:&error]) {
            [myUtil manageError:[error localizedDescription]];
        }

unaReg 是一个核心数据实体,我想更新它的valore 属性。 当我运行 save 命令 (managedObjectContext save:&error) 时,我收到一个错误,因为程序在 if 分支内流动。奇怪的行为是 error 变量是 nil 并且新值正确保存在数据库中(因此似乎没有错误)。 怎么了???? 谢谢。

【问题讨论】:

    标签: core-data save


    【解决方案1】:

    您需要将NSError *error = nil; 设置为安全,否则您将获得一个未确定的内存位置。

    就像提到的 gerry3 一样,您可能有一个 nil managedObjectContext。我建议将代码更改为:

    unaReg.valore = [NSNumber numberWithInt:val];
    NSError *error = nil;
    NSAssert(managedObjectContext != nil, @"Context is nil");
    if (![managedObjectContext save:&error]) {
        [myUtil manageError:[error localizedDescription]];
    }
    

    这是 NSAssert 语句的完美用途,因为您可以在开发时使用它们进行内联测试,并且只需一个开关,将它们全部关闭以进行生产。

    如果你的 managedObjectContext 为 nil,那么你会从 -save: 得到一个错误的响应,并且因为你没有将 error 设置为 nil,它会指向内存中的“某物”,进一步造成混乱。

    【讨论】:

    • 由于这一步只是实体树之旅的最后一步,我认为错误可能在这里很远。我有很多 ViewControllers 将子实体发送到子 ViewController,如下面的代码所示。 myViewController *myVC = [[myViewController alloc] initWithNibName:@"myNib" bundle:nil]; myVC.entity = [自我实体]; myVC.managedObjectContext = self.managedObjectContext; [self.navigationController pushViewController:myVC 动画:YES]; [myVC 发布];你认为最后一个版本会导致内存泄漏吗?谢谢
    • 在该示例中不,它不会导致内存泄漏。你按照我的建议输入了断言吗?
    • 是的,但现在我得到了 EXC_BAD_ACCESS。我想我需要寻找坏的释放对象......这不是一个简单的任务!
    • 断言不会导致错误访问。听起来您的问题比您意识到的要多!您是否通过静态分析器运行您的应用程序?如果不是,您需要然后清理所有警告和分析器结果。全部。
    • 这个错误让我很头疼。现在我再次得到一个零错误指针,但数据已正确保存在数据库中。这是奇迹吗???
    【解决方案2】:

    仔细检查您的托管对象上下文是否已设置:

        unaReg.valore = [NSNumber numberWithInt:val];
        NSError *error;
        NSLog(@"moc = %@",managedObjectContext);
        if (![managedObjectContext save:&error]) {
            [myUtil manageError:[error localizedDescription]];
        }
    

    【讨论】:

    • managedObjectContext 已设置,因为此代码是我找到正确 unaReg 实体的循环的一部分
    【解决方案3】:

    如果 managedObjectContext 不为 null,那么您可能还需要检查存储在 managedObjectContext 中的其他托管对象。有时,错误可能在于删除了一些其他对象,而您只需要保存unaReg 对象即可。

    我通常做的是:
    - 检查您在Delete rule 上的数据模型,确保您已正确配置所有这些模型 - 在 managedObjectContext 的保存操作中,确保其他对象由于Delete rule 而以某种方式被删除。

    其他一些我遇到过但现在想不起来的情况。

    希望对你有帮助

    【讨论】:

      猜你喜欢
      • 2016-10-27
      • 1970-01-01
      • 2014-08-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-09-22
      相关资源
      最近更新 更多