2013-04-24 4 views
0

У нас есть этот метод в коде, который возвращает SCNetworkReachabilityRef с помощью SCNetworkReachabilityCreateWithName:Как интерпретировать возврат null из SCNetworkReachabilityCreateWithName?

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

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

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

Итак, что означает возврат NULL и как я могу это обработать?

ответ

0

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

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

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

Я также узнал, что System Configuration Reference содержит информацию об обнаружении и интерпретации ошибок, генерируемых вызовом 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 Reference.

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