Reachability类的EXC_BAD_ACCESS异常

时间:2015-11-07 16:50:36

标签: ios exception memory-management exc-bad-access reachability

我在iOS项目中使用Apple提供的Reachabilityhere。在尝试调用我自己的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
   }
}

2 个答案:

答案 0 :(得分:0)

类似的事情发生在我身上,我的一个应用程序在切换到飞行模式时崩溃并频繁发生Wifi(如果Wi-Fi的信号强度很低,则会发生这种情况)。

在我的情况下,崩溃是由NSAssert导致的,_reachabilityRefnull,因此断言条件失败:

NSAssert(_reachabilityRef != NULL, @"currentNetworkStatus called with NULL SCNetworkReachabilityRef");

我刚删除它并通过为_reachabilityRef

添加额外的空检查来重写该方法

答案 1 :(得分:0)

我有同样的结果:app SOMETIMES 在发布reachabilityRef时崩溃。好像它应该是NULL但不是吗? enter image description here

经过实验,我发现如果我在Reachability.h接口中添加了一些内容(原来它什么都没有):

@interface Reachability : NSObject{
    BOOL dummy;
}

它停止了崩溃,你能尝试并报告它是否有帮助吗?

我使用XCode 7.1.1