我在iOS项目中使用Apple提供的Reachability
类here。在尝试调用我自己的REST Web服务之前,我总是调用它的currentReachabilityStatus
方法:
- (NetworkStatus)currentReachabilityStatus
{
NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL SCNetworkReachabilityRef");
NetworkStatus returnValue = NotReachable;
SCNetworkReachabilityFlags flags;
if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
{
if (_alwaysReturnLocalWiFiStatus)
{
returnValue = [self localWiFiStatusForFlags:flags];
}
else
{
returnValue = [self networkStatusForFlags:flags];
}
}
return returnValue;
}
反过来,我从我为方便起见的自定义类中调用此方法:
+ (BOOL)checkNetStatus
{
Reachability *reach = [Reachability reachabilityForInternetConnection];
NetworkStatus status = [reach currentReachabilityStatus];
return [self boolFromStatus:status];
}
我正在iPhone中执行一些测试,在其设置中启用了飞行模式,然后当应用程序返回到前台时,该方法被多次调用(如果没有可访问性,我的应用程序将重试调用Web服务,直到它们变得可以访问了)最后我在第EXC_BAD_ACCESS
行收到if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags))
个异常,然后应用程序崩溃了。
我不明白为什么,因为在我得到异常和崩溃之前多次调用currentReachabilityStatus
,可能是因为它被调用了很多次并且太快了?我怎么能解决这个问题?
我需要帮助,先谢谢。
编辑:每当我打算调用我的RESTful服务时,我都会这样做:
- (void)callWebService
{
if ([MyReachabilityManager checkNetStatus]) {
[[UIApplication sharedApplication] setNetworkActivityIndicatorVisible:YES];
MyServiceWrapper *requestService = [[MyServiceWrapper alloc] initWithServiceUrl];
[requestService queryService];
}
else {
[self keepRequestingMyService]; // this calls this method again until a timeout
}
}
答案 0 :(得分:0)
类似的事情发生在我身上,我的一个应用程序在切换到飞行模式时崩溃并频繁发生Wifi(如果Wi-Fi的信号强度很低,则会发生这种情况)。
在我的情况下,崩溃是由NSAssert
导致的,_reachabilityRef
是null
,因此断言条件失败:
NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL SCNetworkReachabilityRef");
我刚删除它并通过为_reachabilityRef
答案 1 :(得分:0)