В ответ на аналогичный запрос на форумах разработчиков iOS What does a NULL return from SCNetworkReachabilityCreateWithName mean? (ссылка доступна только членам программы разработчиков iOS), кто-то из поддержки разработчиков Apple отметил, что, насколько ему известно, существует только три причины, по которым SCNetworkReachabilityCreateWithName
может return NULL:
- nodename NULL (
kSCStatusInvalidArgument
); (kSCStatusInvalidArgument
); или
- проблемы с распределением памяти (не устанавливается
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 или нулевой длины является ошибкой логики прогаммы. Третий случай, связанный с памятью, может быть повторным.