2013-04-24 55 views
0

我們在我們的代碼這種方法,使用SCNetworkReachabilityCreateWithName返回SCNetworkReachabilityRef如何解釋從SCNetworkReachabilityCreateWithName返回的空值?

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

有時候,我們得到的可達性參考回NULL。 NULL返回是什麼意思?

Apple doc SCNetworkReachability Reference不討論這些方法的NULL返回值。但Reachability sample code中的Classes/Reachability.m文件說明了SCNetworkReachabilityCreateWithName可以返回NULL的事實,但沒有爲什麼發表評論。

那麼NULL返回是什麼意思,我該如何處理呢?

回答

0

爲了迴應iOS開發者論壇What does a NULL return from SCNetworkReachabilityCreateWithName mean?(鏈接僅供iOS開發人員計劃成員訪問)的類似查詢,Apple開發人員支持人員指出,據他所知,SCNetworkReachabilityCreateWithName可能只有三個原因返回NULL:

  1. nodename爲NULL(kSCStatusInvalidArgument);
  2. nodename爲空(kSCStatusInvalidArgument);或
  3. 內存分配問題(未設置kSCStatusXxx)。

他還指出,可達性API在Darwin中,並且Darwin實現接近OS X和iOS上的實現。代碼SCNetworkReachability.c from Darwin似乎證實他認爲以上三個原因是SCNetworkReachabilityCreateWithName返回NULL的唯一方法。

我還了解到,System Configuration Reference包含有關檢測和解釋通過調用SCxxx功能,特別是之類的東西SCError()SCErrorString()產生的錯誤信息。

我故意造成的,從SCNetworkReachabilityCreateWithName通過傳遞一個NULL返回「」和NULL作爲名稱,然後試圖SCErrorSCErrorString(從系統配置參考引用)你瞧我做了一些有意義的額外信息:

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或零長度主機名是一個程序邏輯錯誤。第三個與內存相關的案例可能是可以重試的。