为什么`&`(&符号)放在一些方法参数前面?

时间:2012-04-07 23:21:06

标签: iphone objective-c nserror

我不知道,为什么在NSError之前,如下所示,我们放置:&error而不是error

E.g。

NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];

希望你能解释一下,这也总是这样或只在某些情况下才需要这样做?感谢。

3 个答案:

答案 0 :(得分:59)

您需要获取error的地址,因为该函数需要修改它。 error通过指针传递,因此您需要“获取地址”运算符&

C和Objective-C按值传递参数。如果您在没有&符号的情况下传递error,并且您调用的方法会修改它,那么调用该函数的函数将看不到任何更改,因为该方法将在其本地副本上运行{ {1}}。

如果您查看方法的签名并在那里看NSError*,您知道在相应参数前面需要一个&符号:

**

答案 1 :(得分:7)

error参数的类型是(NSError **),它是指向NSError指针的指针。您用作参数的error变量可能被声明为NSError *,因此为了使类型正确匹配,您必须使用运算符的地址来获取指针的指针( &error)。该方法首先需要一个指向指针的指针的原因是它可以修改error的值,并使该方法的调用者可以使用该新值。

答案 2 :(得分:6)

基本上,问题的根源是想要返回第二个(可选)对象的黑客。

我们怎么能这样做,因为我们只能归还一件事?好吧,我们可以返回某种(return_value, error)元组,但这有点笨拙。我们可以拥有尽可能多的参数,我们可以做些什么......

因此,方法/函数不能修改它们的参数(确切地说,它们与副本一起操作,因此它们所做的任何修改都是本地的)。也就是说(除了并发问题之外)fetchRequest的值在您的问题中的消息之后将等于fetchRequest的值之前。请注意fetchRequest指向的对象可能会更改,但fetchRequest本身的值不会更改。

这让我们陷入了困境。除了等待,我们知道我们可以愉快地获取参数的值并修改它指向的内容!如果您查看executeFetchRequest:error:的声明,您会看到它需要NSError**。那是“指向NSError指针的指针”。因此,我们可以初始化一个空/悬空NSError*,找到它的地址(使用unary & operator),并将其传入。然后该方法可以分配给NSError*指向的{{1}}此

Voila,我们实际上有可选的额外回报值。