33

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

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

Например.

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

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

  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Error: User Rate Limit Exceeded

    от
  • Этоstandard С указателями ...unary & оператор является адресом & quot; оператор. Много хорошего чтения иtutorials на предмет, и несколько ключевых слов в предыдущем предложении.

    от user166390
  • @ user166390 О, чувак, ты умный !!

    от user3932000
  • возможный дубликатPointers in C: when to use the ampersand and the asterisk

    от user166390
  • 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
    

  • 6

    По сути

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

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

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

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

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