什么是(NSError **)错误?

时间:2010-01-14 21:06:14

标签: iphone objective-c pointers

示例:-save:的{​​{1}}方法声明如下:

NSManagedObjectContext

由于NSError已经是一个类,并且传递一个指针实际上会在- (BOOL)save:(NSError **)error 的实现中修改这个对象的效果,在这里传递一个指向指针的重点是什么?什么是优势/意义?

用法示例:

-save:

6 个答案:

答案 0 :(得分:16)

如果你只是传入一个指针,那么所有方法都可以改变你指向的已经存在的NSError对象。

通过传入一个指向指针的指针,它可以创建新的NSError对象,并为您提供一个指向它们的指针。

答案 1 :(得分:13)

有些人称之为“out”参数。

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

或许令人困惑的是,您传递给save:的局部变量本身就是一个指针,因此变量类型最终成为指针的指针。

底线,它是指向局部变量的指针,无论局部变量是int还是NSError*,它的工作方式都相同。

答案 2 :(得分:6)

@Anon是对的。我将补充:这是产生错误的Cocoa方法,而不是抛出异常。

在您的示例中,您有:

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

在致电save:后,如果出现错误,则save:方法会立即创建新的NSError对象,并将您的error变量更改为从nil指向新的错误对象。这样,您可以自己检查NSError对象并对其做出适当的响应。

国际海事组织,这比抛出一个例外更清楚(在我的哲学中,只有在发生灾难性和不可恢复的事情时才应该这样做。)

答案 3 :(得分:3)

它允许方法分配一个新的NSError并将指针改为指向它,而不是必须修改已经指向的NSError(如果它不够大会怎么样?)

答案 4 :(得分:3)

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

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

答案 5 :(得分:2)

  

如果你只是传了一个指针,全部   该方法可以改变   已存在的NSError对象   你指的是。

您无法更改NSError对象。

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