为了回应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或零长度主机名是一个程序逻辑错误。第三个与内存相关的案例可能是可以重试的。