NSError: передача ошибки в методе

Я не уверен, правильно это или нет:

- (void)parseSomething:(id)targetObject error:(NSError **)error { NSError *parserError = nil; [myParser parse:targetObject error:&parserError]; if (parserError != nil) { *error = parserError; } } 

линия:

 *error = parserError; 

Я установил ошибку в параметре как локальную ошибку, правильно ли это сделано?

или я должен делать:

 error = &parserError; 

вместо?

Вы должны убедиться, что error не равна нулю, прежде чем пытаться разыменовать ее. Кроме того, нет необходимости в локальном NSError. Он написал бы этот код таким образом:

 - (void)parseSomething:(id)targetObject error:(NSError **)error { [myParser parse:targetObject error:error]; } 

Но если вам действительно нужна переменная locale (или для демонстрационных целей). то это:

 - (void)parseSomething:(id)targetObject error:(NSError **)error { NSError *parserError = nil; [myParser parse:targetObject error:&parserError]; if (error && parserError) { *error = parserError; } } 

Кроме того, большинство методов, у которых есть параметр NSError out, как обычно, имеют возвращаемое значение BOOL или какое-либо другое возвращаемое значение для указания успеха или нет. Вы не должны полагаться на параметр ошибки, чтобы указать, была ли ошибка или нет.

 - (BOOL)parseSomething:(id)targetObject error:(NSError **)error { NSError *parserError = nil; BOOL ok = [myParser parse:targetObject error:&parserError]; if (error && parserError) { *error = parserError; } return ok; } 

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

 - (void)parseSomething:(id)targetObject error:(NSError **)error { [myParser parse:targetObject error:error]; } 

Если вы хотите обработать его здесь, вам нужно убедиться, что указатель на error указателя указывает на что-то, иначе вы столкнетесь с сбоем при разыменовании.

Например: метод назывался так

 [object parseSomething:targetObject error:NULL]; 

Следующая строка приводит к сбою:

 *error = parserError; 

Правильный код будет выглядеть так:

 - (void)parseSomething:(id)targetObject error:(NSError**)error { NSError* parserError = nil; [myParser parse:targetObject error:&parserError]; if (error != nil) { *error = parserError; } } 

Не проблема, когда parserError равен нулю, но когда error равна нулю.