Вопрос по objective-c, iphone – Почему `&` (амперсанд) ставится перед некоторыми параметрами метода?

33

Мне интересно, почему перед ошибкой NSE, такой как ниже, мы помещаем:&error и неerror?

Например.

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

Надеюсь, вы можете объяснить, это всегда так или только в определенных ситуациях это необходимо? Благодарю.

возможный дубликатPointers in C: when to use the ampersand and the asterisk user166390
Этоstandard С указателями ...unary & оператор является адресом & quot; оператор. Много хорошего чтения иtutorials на предмет, и несколько ключевых слов в предыдущем предложении. user166390
@ user166390 О, чувак, ты умный !! user3932000

Ваш Ответ

3   ответа
7

error тип параметра(NSError **)это указатель на указатель на NSError.error переменная, которую вы используете в качестве аргумента, вероятно, объявлена какNSError *поэтому, чтобы типы соответствовали должным образом, вы должны использовать адрес оператора, чтобы получить указатель на указатель (&error). Причина, по которой метод нуждается в указателе на указатель, заключается в том, что он может изменить значениеerror и это новое значение будет доступно вам, вызывающему метод.

59

Вам нужно взять адресerror потому что функция должна изменить его.error передаетсяby pointer, поэтому вам нужен & quot; адрес получателя & quot; оператор& для этого.

C и Objective-C передать параметрыby value, Если вы пройдетеerror без амперсанда и вызываемого вами метода его изменения ваша функция, которая произвела вызов, не увидит никаких изменений, потому что метод будет работать с егоlocal copy изNSError*.

Вы знаете, что вам нужен амперсанд перед соответствующим параметром, если вы посмотрите на сигнатуру метода и увидите** там:

- (NSArray *)executeFetchRequest:(NSFetchRequest *)request error:(NSError **)error
                                            //   ^ one                    ^^ two
Error: User Rate Limit Exceeded
6

По сути, корень проблемы заключается в том, что вы хотите вернуть второй (необязательный) объект.

Как мы можем сделать это, поскольку мы можем вернуть только одну вещь? Ну, мы могли бы вернуть какой-то(return_value, error) кортеж, но это немного громоздко. Мы можем иметь столько параметров, сколько захотим, можем ли мы что-то сделать с этими ...

Таким образом, методы / функции не могут изменять свои параметры (точнее, они работают с копией, поэтому любые изменения, которые они делают, являются локальными). То есть (помимо вопросов параллелизма) значениеfetchRequest до того, как сообщение в вашем вопросе будет равно значениюfetchRequest после этого. Обратите внимание на объект, на который указываетfetchRequest может измениться, но значениеfetchRequest Сам выиграл.

Это ставит нас в тупик. Кроме того, подождите, мы знаем, что можем с радостью принять значение параметра и изменить то, на что он указывает! Если вы посмотрите на декларацию дляexecuteFetchRequest:error: вы увидите, что это займетNSError**, Это указатель на указатель наNSError& Quot ;. Итак, мы можем инициализировать пустой / висячийNSError*найти адрес этого (сунарный& operator), и передайте это. Метод может быть назначенNSError* на это указывает

Вуаля, у нас фактически есть дополнительные дополнительные возвращаемые значения.

Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded
Error: User Rate Limit Exceeded

Похожие вопросы