【发布时间】:2016-02-08 16:32:07
【问题描述】:
我在我的 iOS 项目中使用 Apple 提供的 here 的 Reachability 类。在尝试调用我自己的 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