为什么在Cocoa编程中传递&错误而不是错误?

Chi*_*ron 20 cocoa objective-c

在Cocoa编程中,当处理NSError时,为什么我们将错误传递给消息而不是错误?

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

I82*_*uch 23

save方法接受指针指针. 对Cocoa教程有一个很好的解释:使用NSError实现了很好的效果

将指针传递给指针

在上面的例子中使用NSError类非常简单.我只是传入它,如果调用因任何原因失败,我有一个NSError对象来解释问题是什么.但是这个电话的另一方是如何工作的呢?

第一部分是理解将指针传递给指针而不是指向对象的指针的概念.通常,当发送消息时,在消息中传递指向该对象的指针.这在方法签名中用单个星号(*)表示,例如

- (void)appendString:(NSString*)newString这与将指针传递给指针的方法不同.首先,这种类型的参数用两个星号(**)表示,例如:

- (BOOL)save:(NSError**)错误其次,另一个区别是这允许接收方法控制指针(指针指向的)正在引用的内容.这可以说是指针编程中比较混乱的部分之一,但一旦得到它,它就是一个非常强大的工具.换句话说,通过将指针传递给指针,接收方法可以决定变量的值.正如您在上面的代码中看到的,我将error变量初始化为nil.但是,如果保存调用失败,那个变量将不再是nil,而是引用一个实际的NSError对象,我可以询问它.

如果你想了解它是如何工作的,我会建议将双重间接维基百科文章作为一个很好的起点.


小智 9

当你调用该方法时,你没有给它一个指向NSError的指针,你给它一个地方将一个指向NSError的指针传回给你.

我经常写

NSError *error = nil;
Run Code Online (Sandbox Code Playgroud)

这让你更明显的是,error当你打电话时没有任何(有趣的)-save:.它只是您为NSError对象的内存中的地址预留的位置.如果方法遇到错误,它会创建一个NSError对象并写入对象的地址error以将其传递给您.

  • 请记住,您检测到方法返回值发生错误,而不是检查错误是否仍为零. (8认同)

jus*_*tin 7

NSError的字段不可设置.它的界面是不透明和不可变的.因此,如果您要分配/初始化错误,则客户端无法填充它.因此,方法是返回一个新的错误(如果适用),也可以在每种情况下保存您的alloc.

由于返回类型已由方法指定,并且错误是可选的,因此采用此方法在惯用语法c语法中返回错误是有意义的.

哇,客户端既不会改变您传递的内容也不会使用返回错误:(NSError *)outError,因此应用"out参数"表单:(NSError**)outError.

  • 这是我第一次了解到什么是好的 - 谢谢! (2认同)