3

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

    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 上下文。

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

4

3 回答 3

2

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

*error = [NSError errorWithDomain:...]

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

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

于 2012-12-11T20:17:22.657 回答
1

看一下:为什么有些方法参数前面要放`&`(和号)?

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

于 2012-12-11T20:18:45.033 回答
1

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

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

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

[savingError localizedDescription];
于 2015-04-25T09:37:24.317 回答