Как интерпретировать нуль, возвращаемый из SCNetworkReachabilityCreateWithName?

У нас есть этот метод в нашем коде, который возвращает SCNetworkReachabilityRef, используя SCNetworkReachabilityCreateWithName:

- (SCNetworkReachabilityRef)cCreateReachabilityRefWithCStr:(const char *)host {
    return SCNetworkReachabilityCreateWithName(NULL, host);
}

Иногда мы возвращаем NULL для ссылки на доступность. Что означает возврат NULL?

Документ Apple Справочник по SCNetworkReachability не обсуждайте возвраты NULL из этих методов. Но файл Classes/Reachability.m в примере кода Reachability учитывает тот факт, что SCNetworkReachabilityCreateWithName может возвращать NULL, но без комментариев, почему.

Так что же означает возврат NULL и как мне с этим справиться?


person Chris Markle    schedule 24.04.2013    source источник


Ответы (1)


В ответ на аналогичный запрос на форумах разработчиков iOS Что означает возврат NULL из SCNetworkReachabilityCreateWithName? ( ссылка доступна только для участников программы разработчиков iOS), кто-то из службы поддержки разработчиков Apple заметил, что, насколько ему известно, есть только три причины, по которым SCNetworkReachabilityCreateWithName может вернуть NULL:

  1. имя узла равно NULL (kSCStatusInvalidArgument);
  2. имя узла пусто (kSCStatusInvalidArgument); или
  3. проблемы с выделением памяти (не ставится kSCStatusXxx).

Он также отметил, что API-интерфейсы достижимости реализованы в Darwin и что реализация Darwin близка к реализации как в OS X, так и в iOS. Код SCNetworkReachability.c от Darwin кажется, подтверждает его мнение о том, что три вышеупомянутые причины являются единственными способами, которыми SCNetworkReachabilityCreateWithName возвращает NULL.

Я также узнал, что Справочник по конфигурации системы содержит информацию об обнаружении и интерпретации ошибок, возникающих при вызове функций SCxxx, особенно таких, как SCError() и SCErrorString().

Я намеренно вызвал возврат NULL из SCNetworkReachabilityCreateWithName, передав "" и NULL в качестве имен, а затем попробовал SCError и SCErrorString (ссылка из Справочника по конфигурации системы) и, о чудо, я сделал некоторую значимую дополнительную информацию:

reachtest1[9274:11303] isReachableWithName: entry: name: ""
reachtest1[9274:11303] SCNetworkReachabilityCreateWithName returned NULL!
reachtest1[9274:11303] SCError: 1002 SCErrorString: Invalid argument

reachtest1[9274:11303] isReachableWithName: entry: name: (null)
reachtest1[9274:11303] SCNetworkReachabilityCreateWithName returned NULL!
reachtest1[9274:11303] SCError: 1002 SCErrorString: Invalid argument

Это объясняет, что NULL возвращается в двух из трех случаев кода Дарвина.

Также есть способ получить CFErrorRef с помощью SCCopyLastError(), в котором может быть даже больше информации. В дополнение к вышеупомянутому Справочнику по конфигурации системы см. Справочник по CFError.

Учитывая все это, я бы сказал, что первые два случая не могут быть повторены, поскольку передача имени хоста NULL или нулевой длины является логической ошибкой программы. Третий случай, связанный с памятью, может быть повторен.

person Chris Markle    schedule 26.04.2013