Iphone 什么';(n错误**)的错误点是什么?

Iphone 什么';(n错误**)的错误点是什么?,iphone,objective-c,pointers,Iphone,Objective C,Pointers,示例:NSManagedObjectContext的-save:方法声明如下: - (BOOL)save:(NSError **)error 既然NSError已经是一个类了,传递指针实际上会在-save:的实现中修改这个对象,那么在这里传递指针到指针有什么意义呢?有什么好处/意义 用法示例: NSError *error; if (![managedObjectContext save:&error]) { // Handle the error. } 它允许该方法分配一个

示例:
NSManagedObjectContext
-save:
方法声明如下:

- (BOOL)save:(NSError **)error
既然NSError已经是一个类了,传递指针实际上会在
-save:
的实现中修改这个对象,那么在这里传递指针到指针有什么意义呢?有什么好处/意义

用法示例:

NSError *error;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}

它允许该方法分配一个新的NSError并更改指向它的指针,而不必修改已经指向的NSError(如果它不够大怎么办?

如果您刚刚传入一个指针,该方法所能做的一切都将改变您指向的已经存在的NSError对象


通过传入指向指针的指针,它可以创建新的NSError对象,并为您留下指向它们的指针。

优点是您不必创建NSError对象。如文件所述:


“指向NSError对象的指针。您不需要创建NSError对象。”

@Anon是正确的。我要补充一点:这是产生错误的方法,而不是抛出异常

在您的示例中,您有:

NSError *error = nil;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}
调用
save:
后,如果出现错误,则
save:
方法将创建一个新的
NSError
对象,并将
error
变量从
nil
改为指向新的错误对象。这样,您就可以自己检查
n错误
对象并对其做出适当的响应


在我看来,这比抛出异常(在我的哲学中,只有当灾难性和不可恢复的事情发生时才应该这样做)更干净。

这就是一些人所说的“out”参数

您没有传递指向NSError对象的指针,而是传递指向局部变量的指针。这使被调用的方法能够修改局部变量;在本例中,将其分配给NSError实例

可能令人困惑的是,传递给
save:
的局部变量本身就是指针,因此变量类型最终是指向指针的指针

总之,它是一个指向局部变量的指针,无论局部变量是
int
还是
NSError*
,它的作用都是一样的


如果您刚刚传入一个指针,则所有 该方法所能做的将改变 已存在的NSError对象 你指的是

不能更改NSError对象


N错误是不可变的。这就是您需要指向NSError变量的指针的原因。您只能创建一个全新的N错误。因此,您可以将指针更改为指向新创建的N错误。

您应该将错误初始化为nil。在该示例中,不需要将错误初始化为nil。从方法返回时,错误的值是完全未定义的,除非该方法返回nil或NO。我总是将NSErrors初始化为nil,但我想我在解释内部如何处理错误时是错误的:这样做没有害处。只有预期的伤害才重要。:)苹果从不这样做;-)所以我觉得那很好,有点。如果传入对现有NSError的引用,则NSError实现必须支持可变性。这将是一个完全不同的API合同。否则,正确。我在这个问题上添加了一组相关的示例。你能用一个例子对此做进一步的说明吗?因为上面MacMark说
NSError
是不可变的,所以你唯一的选择就是创建一个。我猜您的意思是呼叫方不需要创建
n错误
,但是,如果要返回错误,那么被呼叫方当然需要创建
n错误
。您的答案有点不清楚。我很困惑。如果您将地址发送到nil n错误,则在创建一个n错误之前,没有可“修改”的n错误。此外,N错误是不可变的,所以根据上面的MacMark,您无论如何都不能编辑它。我希望我能理解所有这些相互矛盾的答案。我喜欢你的解释,但我对nil局部变量如何可以传递给另一个方法的有效地址一无所知。你能详细说明一下吗?这就是为什么需要**(指针指针的指针)来检索函数调用方遇到的新错误的原因。