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

Jos*_*ane 33 iphone objective-c nserror

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

例如

NSArray *result = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
Run Code Online (Sandbox Code Playgroud)

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

das*_*ght 59

你需要获取地址,error因为函数需要修改它.由指针error传递,因此您需要"获取地址"运算符.&

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

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

- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error
                                            //   ^ one                    ^^ two
Run Code Online (Sandbox Code Playgroud)

  • 最好的解释.一直想知道这件事. (5认同)

UIA*_*dam 7

error参数的类型是(NSError **),这是一个指向的指针NSError.将error你作为参数使用可能是声明为变量NSError *,所以为了获得类型搭配得当,你必须使用运营商的地址,以获得一个指针的指针(&error).该方法首先需要一个指向指针的指针的原因是它可以修改该值的error值,并使该方法的调用者可以使用该新值.


Kri*_*ass 6

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

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

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

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

瞧,我们实际上有可选的额外返回值.