【问题标题】:EXC_BAD_ACCESS exception at Reachability class可达性类的 EXC_BAD_ACCESS 异常
【发布时间】:2016-02-08 16:32:07
【问题描述】:

我在我的 iOS 项目中使用 Apple 提供的 hereReachability 类。在尝试调用我自己的 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 服务,直到它们变得可访问),最后我在if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)) 行得到了一个EXC_BAD_ACCESS 异常,应用程序崩溃了。

我不明白为什么,因为在我得到异常和崩溃之前,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
   }
}

【问题讨论】:

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


    【解决方案1】:

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

    在我的例子中,崩溃是由NSAssert引起的,_reachabilityRefnull,所以断言条件失败:

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

    我刚刚删除了它并通过为 _reachabilityRef 添加额外的空检查来重新编写该方法

    【讨论】:

    • 谢谢。在我的情况下,_reachabilityRef 在我收到错误时不为空......我会与内存管理有关,考虑到我在多次调用该方法时会发现这一点行因为缺乏可达性,但我不知道如何处理它......
    • 嗨@Midhun MP你能添加你的方法吗?我也面临同样的问题。我试过了,但没有用。请在您的答案中添加此条件。
    【解决方案2】:

    我也有同样的情况:应用有时在释放reachabilityRef 时崩溃。似乎它应该是 NULL 但它不是?

    实验后我发现如果我在 Reachability.h 界面中添加了一些东西(最初它什么都没有):

    @interface Reachability : NSObject{
        BOOL dummy;
    }
    

    它停止了崩溃,您可以尝试一下并报告是否有帮助?

    我使用 XCode 7.1.1

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多