什么是(NSError**)错误?

ope*_*rog 8 iphone pointers objective-c

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

- (BOOL)save:(NSError **)error
Run Code Online (Sandbox Code Playgroud)

由于NSError已经是一个类,并且传递一个指针实际上会在实现中修改这个对象的效果,-save:这里将指针传递给指针有什么意义呢?什么是优势/感觉?

用法示例:

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

Mat*_*eer 16

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

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

  • 有点.如果传入对现有NSError的引用,则NSError实现必须支持可变性.这将是一个完全不同的API合同.否则,正确. (5认同)

Dar*_*ren 13

有些人称之为"out"参数.

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

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

底线,它是一个指向局部变量的指针,无论局部变量是一个int还是一个,它都是一样的NSError*.


Dav*_*ong 6

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

在您的示例中,您有:

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

在调用之后save:,如果出现错误,该save:方法将立即创建一个新NSError对象,并将您的error变量更改为指向nil新的错误对象.这样您就可以NSError自己检查对象并对其做出适当的响应.

IMO,这比抛出异常更清晰(在我的哲学中,只有在发生灾难性和不可恢复的事情时才应该这样做).