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