回应 iOS 开发者论坛上的类似查询SCNetworkReachabilityCreateWithName 返回的 NULL 是什么意思?(此链接仅供 iOS 开发者计划成员访问),Apple 开发者支持人员指出,据他所知,SCNetworkReachabilityCreateWithName
可能返回 NULL 的原因只有三个:
- 节点名称为 NULL (
kSCStatusInvalidArgument
);
- 节点名为空(
kSCStatusInvalidArgument
);或者
- 内存分配问题(不设置 a
kSCStatusXxx
)。
他还指出,可达性 API 在 Darwin 中,并且 Darwin 的实现与 OS X 和 iOS 上的实现很接近。Darwin的代码SCNetworkReachability.c似乎证实了他的观点,即上述三个原因是SCNetworkReachabilityCreateWithName
返回 NULL 的唯一方法。
我还了解到,系统配置参考包含有关检测和解释调用SCxxx
函数产生的错误的信息,特别是SCError()
和SCErrorString()
.
我故意通过传递 "" 和 NULL 作为名称来导致 NULL 返回SCNetworkReachabilityCreateWithName
,然后尝试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 或零长度主机名是程序逻辑错误。第三种与内存相关的情况可能是可重试的。