【问题标题】:Saving to iOS managed object context保存到 iOS 托管对象上下文
【发布时间】:2012-12-11 20:12:08
【问题描述】:

我有以下代码将实体保存到托管对象上下文中。

    NSError *savingError = nil;

    if ([self.managedObjectContext save:&savingError]) {
        NSLog(@"Successfully saved the context.");
    } else {
        NSLog(@"Failed to save the context. Error = %@", savingError);
    }

根据我的文档,我理解以下内容:将新实体插入上下文后,我们必须保存上下文。这会将上下文的所有未保存数据刷新到持久存储。我们可以使用托管对象上下文的save: 实例方法来做到这一点。如果这个方法的BOOL返回值是YES,我们可以确定out context被保存了。

我不清楚的是save: 之后的语法,特别是本地savingError variable 之前的& 符号。这告诉编译器什么?

【问题讨论】:

    标签: ios managedobjectcontext


    【解决方案1】:

    & 运算符的基本意思是“地址”。它接受一个值并返回一个指向该值的指针。所以在这种情况下,&savingError 是一个 NSError** 类型的值,它是一个指针,它保存着你的 savingError 变量的地址。然后调用代码可以使用*error 来“取消引用”该指针并取回您的变量。这意味着它可以说

    *error = [NSError errorWithDomain:...]
    

    然后在您的代码中,savingError 变量现在将填充新错误。

    这是 C 中一种相当常见的编程风格,用于模拟具有多个返回值。像这样的参数(指向值的指针,您在其中传递变量的地址并由函数填充)通常称为“out-parameters”或“out-params”。

    【讨论】:

      【解决方案2】:

      看看:Why is `&` (ampersand) put in front of some method parameters?

      简而言之:您需要传递一个指向 NSError 指针的指针,因此save: 可以将偶尔的错误分配给savingError

      【讨论】:

        【解决方案3】:

        & 表示对象的地址。当我们将对象传递给方法时,对象的副本已传递给它。在该方法中对该对象所做的任何更改都不会影响与方法调用一起使用的对象。

        当我们使用 & 时,实际上我们传递了对象的地址,因此我们在该方法中对对象所做的任何更改都会影响在方法调用中用作参数的对象。

        save: 方法中,我们传递了一个NSError 类的对象。如果在 Save 方法(过程)的过程中发生了一些错误,可以使用这个 NSError 对象找到。

        [savingError localizedDescription];
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-03-16
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2011-08-16
          相关资源
          最近更新 更多