В чем суть ошибки (NSError **)? - PullRequest
8 голосов
/ 15 января 2010

Пример: -save: метод NSManagedObjectContext объявлен так:

- (BOOL)save:(NSError **)error

Поскольку NSError уже является классом, и передача указателя фактически приведет к изменению этого объекта внутри реализации -save:, какой смысл здесь передавать указатель на указатель? В чем преимущество / смысл?

Пример использования:

NSError *error;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}

Ответы [ 6 ]

16 голосов
/ 15 января 2010

Если вы только что передали указатель, все, что мог сделать метод, это изменило бы уже существующий объект NSError, на который вы указываете.

Передав указатель на указатель, он может создавать новые объекты NSError и оставлять вас с указателем на них.

13 голосов
/ 15 января 2010

Это то, что некоторые люди называют параметром "out".

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

Возможно, сбивает с толку то, что локальная переменная, которую вы передаете save:, сама по себе является указателем, поэтому тип переменной заканчивается указателем на указатель.

В итоге, это указатель на локальную переменную, и он работает одинаково, независимо от того, является ли локальная переменная int или NSError*.

6 голосов
/ 15 января 2010

@ Анон правильный. Я добавлю: это способ Какао генерировать ошибки вместо исключения.

В вашем примере у вас есть:

NSError *error = nil;
if (![managedObjectContext save:&error]) {
    // Handle the error.
}

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

ИМО, это чище, чем выбрасывать исключение (что в моей философии должно быть сделано только тогда, когда происходит что-то катастрофическое и неустранимое).

3 голосов
/ 15 января 2010

Преимущество в том, что вам не нужно создавать объект NSError. Как указано в документации:

" Указатель на объект NSError. Вам не нужно создавать объект NSError. "

3 голосов
/ 15 января 2010

Это позволяет методу выделить новый NSError и изменить указатель так, чтобы он указывал на него, вместо того, чтобы изменять NSError, на который уже был указан (что, если он недостаточно велик?)

2 голосов
/ 23 ноября 2010

Если вы только что передали указатель, все метод мог бы изменить уже существующий объект NSError, который Вы указываете на.

Вы не можете изменить объект NSError.

NSError является неизменным. Вот почему вам нужен указатель на переменную NSError. Вы можете создать только новый NSError. Таким образом, вы меняете указатель так, чтобы он указывал на вновь созданную ошибку NSE.

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