爲了迴應iOS開發者論壇What does a NULL return from SCNetworkReachabilityCreateWithName mean?(鏈接僅供iOS開發人員計劃成員訪問)的類似查詢,Apple開發人員支持人員指出,據他所知,SCNetworkReachabilityCreateWithName
可能只有三個原因返回NULL:
- nodename爲NULL(
kSCStatusInvalidArgument
);
- nodename爲空(
kSCStatusInvalidArgument
);或
- 內存分配問題(未設置
kSCStatusXxx
)。
他還指出,可達性API在Darwin中,並且Darwin實現接近OS X和iOS上的實現。代碼SCNetworkReachability.c from Darwin似乎證實他認爲以上三個原因是SCNetworkReachabilityCreateWithName
返回NULL的唯一方法。
我還了解到,System Configuration Reference包含有關檢測和解釋通過調用SCxxx
功能,特別是之類的東西SCError()
和SCErrorString()
產生的錯誤信息。
我故意造成的,從SCNetworkReachabilityCreateWithName
通過傳遞一個NULL返回「」和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
從Darwin代碼的三個案例中的兩個案例中獲得返回值。
還有一種方法可以使用SCCopyLastError()
來獲得CFErrorRef
,這實際上可能包含更多信息。除了上述系統配置參考,請參閱CFError Reference。
考慮到這一切,我會說前兩種情況下不會重試,因爲傳遞NULL或零長度主機名是一個程序邏輯錯誤。第三個與內存相關的案例可能是可以重試的。