Синтаксис ** в цели C - PullRequest
       20

Синтаксис ** в цели C

1 голос
/ 12 февраля 2012

Простой вопрос. Что означает двойная звездочка в интерфейсе ниже? Это не указатель NSError, но что?

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

Ответы [ 3 ]

7 голосов
/ 12 февраля 2012

Это указатель на указатель на NSError. Он используется в качестве «параметра out» - или вы можете думать о нем как о указателе на экземпляр NSError, учитывая, что экземпляр NSObject всегда является указателем.

Вы используете это так:

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;
}
1 голос
/ 12 февраля 2012

Ознакомьтесь с этой записью в блоге: «Использование NSError To Great Effect» и обратите особое внимание на раздел «Передача указателей указателям».

Также на вики-странице указателей есть раздел «Множественное косвенное обращение»

1 голос
/ 12 февраля 2012

Вы вызываете это, отправляя ссылку на NSError*, вот так:

NSError *myError = NULL;
[foo checkResourceIsReachableAndReturnError:&myError];
if (myError) {
    /* look through info, handle error, etc. */
}

Метод -checkResourceIsReachableAndReturnError: может изменять указатель myError, включая выделение места для нового NSError. Это позволяет легко проверить, не было ли ошибки, просто проверив, является ли myError ненулевым NULL.

...