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