Простой вопрос. В чем смысл двойной звездочки в интерфейсе ниже? Это не указатель NSError, но что?Синтаксис ** в объективе C
- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
Простой вопрос. В чем смысл двойной звездочки в интерфейсе ниже? Это не указатель NSError, но что?Синтаксис ** в объективе C
- (BOOL)checkResourceIsReachableAndReturnError:(NSError **)error
Это указатель на указатель на NSError
. Он используется как «параметр out» - или вы можете подумать об этом как о указателе на экземпляр NSError
, считая, что экземплярвсегда является указателем.
Вы можете использовать его как это:
NSError * outError = nil; << reserve place and a name for the out parameter
// pass the error so the client may return it to you:
BOOL ret = [obj checkResourceIsReachableAndReturnError:&outError];
if (nil != outError) { << the error was set in checkResourceIsReachableAndReturnError:
NSLog(@"Error: %@", outError); << log it
}
…
На стороне реализации, это выглядит следующим образом:
- (BOOL)checkResourceIsReachableAndReturnError:(NSError**)outError
{
if (self.isThingReachable) {
// okay - the caller may not be interested in the error, test it:
if (0 != outError) {
// they are interested this time!
*outError = [NSError errorWithBlahBlahBlah];
}
return NO;
}
return YES;
}
Вы называете это, отправив ссылку на NSError*
, например, так:
NSError *myError = NULL;
[foo checkResourceIsReachableAndReturnError:&myError];
if (myError) {
/* look through info, handle error, etc. */
}
Метод -checkResourceIsReachableAndReturnError:
может изменить указатель myError
, включая выделение пространства для нового NSError
. Это позволяет вам легко проверить, была ли ошибка, просто проверив, является ли myError
не NULL
.
Отметьте это сообщение в блоге: "Using NSError To Great Effect" и обратите особое внимание на раздел «Передача указателей на указатели».
Также на странице wiki на указателях есть раздел на "Multiple Indirection"