Концепция NSError - PullRequest
       1

Концепция NSError

3 голосов
/ 16 ноября 2011

Я использовал NSError в нескольких местах, но я не совсем понимаю концепцию, стоящую за этим. Особенно, почему он используется с использованием двойного указателя:

NSError *err = nil;
NSString *s = nil;
s = [NSString stringWithContentsOfURL:url error:&err];

Так почему же мы не можем просто передать переменную err методу, который, насколько я могу судить, все равно передается как "по ссылке".

Спасибо за разъяснения

Ответы [ 2 ]

3 голосов
/ 16 ноября 2011

Это - одно из лучших описаний NSError.

На самом деле вы передаете не объект, а указатель на указатель.Таким образом, вы можете установить NSError перед отправкой сообщения объекту на nil, и только в случае ошибки ваш NSError «внезапно» будет содержать значение, так что вы сможете делать такие вещи:

NSError *err = nil;

[SomeClass doSomethingGreatWhichCanFailWithError:&err];

if(err) {
   NSLog("Something failed :-(");
   //TODO: Add better logging!
}

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

2 голосов
/ 16 ноября 2011

Передача объекта по ссылке потребует от вас выделения и инициализации объекта NSError, которым затем может манипулировать вызываемый метод для удовлетворения потребностей. Это также требует наличия всей функциональности либо непосредственно в NSError, либо требует, чтобы вызывающая сторона знала и использовала определенные подклассы NSError.

При использовании этого метода вызывающая программа вообще не должна создавать объект NSError. В большинстве случаев не должно возникать ошибок, и нет создания бесполезных объектов ошибок. Кроме того, любой класс может иметь подкласс NSError для предоставления дополнительной информации. Если вызывающая программа не заботится об этом, она интерпретирует возвращаемый объект как простой NSError, и все в порядке. Если вызывающий абонент заинтересован в деталях, он может привести его к подклассу и получить дополнительную информацию.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...