0

Я использую класс Reachability, предоставленный компанией Apple в моем проекте iOS here. Я называю свой метод currentReachabilityStatus всегда, прежде чем пытаться назвать свои REST веб-службы:Исключение EXC_BAD_ACCESS в классе достижимости

- (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, позволяя режим полета в настройках, а затем, когда приложение возвращается на передний план, этот метод вызывается несколько раз (мое приложение повторяет вызовы веб-сервисов, если их невозможно достичь, пока они не станут достижимый), и, наконец, я получаю EXC_BAD_ACCESS Исключение в строке if (SCNetworkReachabilityGetFlags(_reachabilityRef, &flags)), и приложение падает.

Я не понимаю, почему именно потому, что currentReachabilityStatus вызывается несколько раз, прежде чем я получу исключение и авария, не так ли, потому что это называется много раз и слишком быстро? Как я могу это решить?

Мне нужна помощь, спасибо заранее.

EDIT: всякий раз, когда я буду называть моих 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

Нечто подобное произошло и со мной, один из моего приложения разбился при переключении в режим полета и к Wi-Fi часто (произошло, если Wi-Fi имеет низкий уровень сигнала).

В моем случае авария вызвана NSAssert, то _reachabilityRef был null, поэтому условие утверждает терпело неудачу:

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

я только удалил, что и переписал этот метод путем добавления дополнительной проверки нулевой для _reachabilityRef

+0

Спасибо. В моем случае, '_reachabilityRef' не является нулевым в точке, где я получаю ошибку ... Я был бы связан с управлением памятью, принимая во внимание, что я нахожу это, когда вы вызываете метод много раз в из-за отсутствия достижимости, но я не знаю, как с этим справиться ... – AppsDev

+0

Привет @Midhun MP вы можете добавить свой метод. Я также сталкиваюсь с той же проблемой. Я попытался, но это не сработало. Добавьте это условие в свой ответ. –

0

У меня было то же самое: приложение ИТОГИ сбой при отпускании достижимостиRef. Похоже, это должно быть NULL, но это не так? enter image description here

После экспериментов я нашел, если я добавил что-то в интерфейсе Reachability.h (изначально это не было ничего):

@interface Reachability : NSObject{ 
    BOOL dummy; 
} 

он остановил сбой, вы могли бы попробовать это и сообщить, если это помогает?

Я использую XCode 7.1.1