2012-04-07 93 views
31

I'ver想知道,为什么在一个NSError的前面,如下面,我们就把:&error而不是error为什么`&`(&符号)放在某些方法参数的前面?

E.g.

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

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

+1

这是*标准* C指针... *一元*操作符是操作符的“地址”。关于这个主题的很多很好的阅读和*教程*,以及前一句中的几个关键词。 – 2012-04-07 23:37:08

+1

[C中的指针:何时使用&符号和星号]的可能重复(http://stackoverflow.com/questions/2094666/pointers-in-c-when-to-use-the-ampersand-and-the -asterisk) – 2012-04-07 23:42:04

+0

@ user166390哦,你真聪明! – user3932000 2017-04-13 23:29:02

回答

55

你需要采取的error的地址,因为函数需要修改它。 error通过指针通过,因此您需要“接收地址”运算符&

C和Objective-C通参数由值。如果你传递error没有符号和调用修改它的方法,你的函数进行调用将不会看到任何变化,因为该方法将其本地副本的NSError*操作。

你知道,如果你看一下方法的签名,看到**有你需要的符号在相应的参数前:

- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error 
              // ^one     ^^ two 
+5

有史以来最好的解释。一直想知道这一点。 – 2013-04-04 11:54:55

7

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

6

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

我们该怎么做,因为我们只能返回一件事?那么,我们可以返回某种类型的元组,但这有点笨拙。我们可以有很多的参数,因为我们喜欢,虽然,我们可以做一些与...

所以,方法/函数不能修改其参数(准确地说,他们有一份工作,所以任何修改,他们使本地)。也就是说,并发问题搁置在fetchRequest之后,问题中的消息将等于之后的值fetchRequest。请注意0​​指向的对象可能会更改,但fetchRequest本身的值不会。

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

瞧,我们有效地有可选的附加返回值。

+0

感谢您的解释。我相信我几乎明白这一点。我知道为了工作而在方法中创建了fetchRequest的本地副本,所以原始的fetchRequest将保持不变。但为什么然后fetchRequest指向的对象更改,但fetchRequest的值没有? – marciokoko 2013-08-17 15:23:18

+0

试试这个比喻:我告诉你“在那里计算框3中的文件并告诉我有多少文件”。我是来电者,我给你一个指针。你现在可以对盒子3的内容做任何你喜欢的事情(在你给出的指针处修改对象),甚至可以决定你将忽略我告诉你的内容并看看框2,但是没有一个这会影响我给你的价值(来电者的背景) – 2013-08-18 13:39:33

+0

头脑风暴!同意!理解...必须解析以备后用! – marciokoko 2013-08-19 16:07:07

相关问题