Подтвердить что ты не робот

Почему передача & ошибка вместо ошибки в программировании Cocoa?

В Cocoa программировании при работе с NSError, почему мы передаем сообщение вместо ошибки?

NSError *error;
if (![managedObject.managedObjectContext save:&error])
   //Code
4b9b3361

Ответ 1

Метод сохранения принимает указатель на указатель. Хорошее объяснение в Cocoa Учебное пособие: использование NSError для Великого эффекта

Передача указателей на указатели

Использование класса NSError в приведенном выше Пример довольно прост. Я просто прохожу это, и если вызов не удался для по какой-то причине у меня есть NSError объект, чтобы объяснить, что проблема был. Но как другая сторона этот вызов работает?

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

- (Недействительными) appendString: (NSString *) NewString Это другое, чем указатель на указатель. Во-первых, этот тип аргумента обозначается двумя звездочка (**), например:

- (BOOL) save: (NSError **) ошибка Вторая, другая разница - это позволяет метод приема для контроля того, что указатель (указатель указывая на) ссылается на. Это возможно, один из самых запутанных части программирования указателя, но один раз вы его получите, это очень мощный инструмент. Иными словами, передавая указатель указателю, метод приема может решить, значение переменных. Как вы можете видеть в мой код выше, я инициализировал ошибку переменная до нуля. Однако, если сохранение вызов терпит неудачу, эта переменная не будет дольше ноль, но будет ссылаться на фактический объект NSError, который я могу, чем допрашивать.

Если вы хотите понять, как это я предлагаю double статьи о википедии отличная отправная точка.

Ответ 2

Когда вы вызываете метод, вы не указываете ему указатель на NSError, вы предоставляете ему место для передачи указателю на NSError к вам.

Я часто пишу

NSError *error = nil;

что делает его более очевидным, что в error нет ничего (интересного), когда вы вызываете -save:. Это просто место, которое вы отложили для адреса в памяти объекта NSError. Если метод встречает ошибку, он создает объект NSError и записывает адрес объекта в error, чтобы передать его вам.

Ответ 3

Поля NSError не устанавливаются. его интерфейс непрозрачен и неизменен. поэтому, если вы должны были вывести/инициировать ошибку, клиент не смог бы ее заполнить. таким образом, подход состоит в том, чтобы вернуть новую ошибку (если применимо), а также сохранить вас из allocs в каждом случае.

так как тип возврата уже указан методом, а ошибка является необязательной, имеет смысл применить этот подход для возврата ошибки в идиоматическом синтаксисе C.

iow, клиент не может ни мутировать, что вы проходите, ни возвращать ошибку, используя :(NSError *)outError, поэтому применяется форма "out parameter" :(NSError**)outError.

Ответ 4

Это адрес-оператор; он создает указатель, указывающий на референт. В этом случае ошибка является NSError *, она принимает адрес и может изменять ошибку через этот указатель, чтобы указать на произошедшую ошибку.