1

我们的代码中有这个方法,它返回一个SCNetworkReachabilityRefusing SCNetworkReachabilityCreateWithName

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

有时我们会返回 NULL 作为可达性参考。NULL 返回是什么意思?

Apple doc SCNetworkReachability Reference没有讨论这些方法的 NULL 返回。但是Reachability 示例代码SCNetworkReachabilityCreateWithName中的 Classes/Reachability.m 文件说明了可以返回 NULL的事实,但没有说明原因。

那么 NULL 返回是什么意思,我该如何处理呢?

4

1 回答 1

1

回应 iOS 开发者论坛上的类似查询SCNetworkReachabilityCreateWithName 返回的 NULL 是什么意思?(此链接仅供 iOS 开发者计划成员访问),Apple 开发者支持人员指出,据他所知,SCNetworkReachabilityCreateWithName可能返回 NULL 的原因只有三个:

  1. 节点名称为 NULL ( kSCStatusInvalidArgument);
  2. 节点名为空(kSCStatusInvalidArgument);或者
  3. 内存分配问题(不设置 a kSCStatusXxx)。

他还指出,可达性 API 在 Darwin 中,并且 Darwin 的实现与 OS X 和 iOS 上的实现很接近。Darwin的代码SCNetworkReachability.c似乎证实了他的观点,即上述三个原因是SCNetworkReachabilityCreateWithName返回 NULL 的唯一方法。

我还了解到,系统配置参考包含有关检测和解释调用SCxxx函数产生的错误的信息,特别是SCError()SCErrorString().

我故意通过传递 "" 和 NULL 作为名称来导致 NULL 返回SCNetworkReachabilityCreateWithName,然后尝试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

这解释了从达尔文代码的三个案例中的两个案例中返回 NULL 的原因。

还有一种方法可以CFErrorRef使用SCCopyLastError()它实际上可能包含更多信息。除了前面提到的系统配置参考,请参阅CFError 参考

鉴于这一切,我想说前两种情况不能重试,因为传递 NULL 或零长度主机名是程序逻辑错误。第三种与内存相关的情况可能是可重试的。

于 2013-04-26T18:21:16.313 回答