我不知道,为什么在NSError之前,如下所示,我们放置:&error
而不是error
?
E.g。
NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
希望你能解释一下,这也总是这样或只在某些情况下才需要这样做?感谢。
答案 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,我们实际上有可选的额外回报值。