iOS UIAlertView 给出 EXC_BAD_ACCESS

Posted

技术标签:

【中文标题】iOS UIAlertView 给出 EXC_BAD_ACCESS【英文标题】:iOS UIAlertView giving EXC_BAD_ACCESS 【发布时间】:2012-10-03 02:52:45 【问题描述】:

我已经搜索了一段时间并尝试了很多东西,但我无法让这个错误消失。我有一个通过下拉方法刷新的表。我还使用 Apple 的可达性来确定互联网连接。当我在互联网上运行我的应用程序,然后在应用程序运行时关闭互联网,我的应用程序在尝试显示 UIAlertView 时崩溃。虽然,当我在没有互联网的情况下启动我的应用程序,然后在应用程序运行时打开互联网并将其关闭时,应用程序不会崩溃并且一切正常。任何帮助将不胜感激。

错误发生在 [message show] 行。

修改后的代码:

- (void)loadCallList 

NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];

NSURLRequest *theRequest = [NSURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:10.0];
NSURLConnection *theConnection = [[NSURLConnection alloc] initWithRequest:theRequest delegate:self];

if (theConnection) 

    NSLog(@"Reachable");

    self.headerHeight = 45.0;

    NSData *data = [[NSData alloc] initWithContentsOfURL:theURL];
    xpathParser = [[TFHpple alloc] initWithhtmlData:data];
    NSArray *elements = [xpathParser searchWithXPathQuery:@"//input[@id='hidXMLID']//@value"];

        if (elements.count >= 1) 

            TFHppleElement *element = [elements objectAtIndex:0];
            TFHppleElement *child = [element.children objectAtIndex:0];
            NSString *idValue = [child content];

            NSString *idwithxml = [idValue stringByAppendingFormat:@".xml"];
            NSString *url = @"http://www.wccca.com/PITS/xml/fire_data_";
            NSString *finalurl = [url stringByAppendingString:idwithxml];

            xmlParser = [[XMLParser alloc] loadXMLByURL:finalurl];

            [callsTableView reloadData];
        
    

else 

    NSLog(@"Not Reachable");

    self.headerHeight = 0.0;

    UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"No Internet Connection"
                                                      message:@"Please check your internet connection and pull down to refresh."
                                                     delegate:self
                                            cancelButtonTitle:@"OK"
                                            otherButtonTitles:nil];
    [message show];
    [message release];


[pull finishedLoading];

【问题讨论】:

在你的 alertView 上尝试 [autorelease] 而不是 release 当你打开僵尸时会发生什么?你是说所有其他警报视图都可以正常工作吗?您是否还说导致崩溃的那个在某些时候正在工作?最后,一切都在主线程上运行吗? 确定是警报吗?评论它并测试它。 自动释放不起作用。我已经有僵尸了,这就是我得到的错误。所有其他警报视图都可以正常工作,是的。只有当我通过互联网启动应用程序然后在运行中途关闭互联网并尝试刷新时,它才会使应用程序崩溃。如果我在没有互联网的情况下启动应用程序,然后打开/关闭/打开/关闭互联网多次,一切正常。是的,一切都在主线程上。 @JonErickson 你的意思是不运行 ARC 对吗?我在您的代码中看到 release 调用... 【参考方案1】:

我使用 sendAsynchronousRequest:queue:completionHandler: 作为从 URL 下载数据的方法测试了以下方法。它似乎工作正常,我可以通过弄乱 URL 或将超时间隔设置为 0.1 秒来触发 else 子句。

    NSURL *theURL = [NSURL URLWithString:@"http://www.wccca.com/PITS/"];

    NSURLRequest *theRequest = [NSURLRequest requestWithURL:theURL cachePolicy:NSURLRequestReloadIgnoringLocalCacheData timeoutInterval:5];
    [NSURLConnection sendAsynchronousRequest:theRequest queue:[NSOperationQueue mainQueue] completionHandler:^(NSURLResponse *response, NSData *data, NSError *error) 
        if (error == nil) 
            //do whatever with the data.  I converted it to a string for testing purposes.
            NSString *text = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
            NSLog(@"%@",text);
        else
            NSLog(@"%@",error.localizedDescription);
            UIAlertView *message = [[UIAlertView alloc] initWithTitle:@"No Internet Connection" message:@"Please check your internet connection and pull down to refresh." delegate:self cancelButtonTitle:@"OK" otherButtonTitles:nil];
            [message show];
        
    ];

【讨论】:

【参考方案2】:

你有两个问题:

    您不应使用可达性来确定是否存在 Internet 连接。可达性仅对确定离线连接何时恢复在线有用。真的。拨打网络电话有时足以启动无线电并连接,因此如果您尝试预先检查是否有互联网连接,无线电将保持关闭状态。

    第二个问题是不能在主线程上进行同步网络调用。这包括可达性和 [NSData dataWithContentsOfURL:xxx]。使用 Grand Central Dispatch、NSOperationQueues、NSURLConnections 或 NSThreads 将它们放在辅助线程上。否则,如果网络状况不佳,您的应用程序可能会锁定,并且系统看门狗计时器会终止您的应用程序。

【讨论】:

那你建议我如何检查互联网连接? 你不检查。您建立连接,如果连接失败,您将处理失败。无论如何,你必须处理失败,所以这并不是真正的工作,而只是一种不同的思维方式。 是的,这是有道理的。我会努力把它改成那样。你知道为什么我的 AlertView 失败了吗?我应该与那无关.... 我认为您可能在可达性或网络调用中锁定超过 20 秒,并且系统看门狗计时器正在杀死您。 是的,使用 NSURLConnections、Grand Central Dispatch、NSOperationQueues 或 NSThreads 在辅助线程上进行网络连接。或者使用第三方网络库。

以上是关于iOS UIAlertView 给出 EXC_BAD_ACCESS的主要内容,如果未能解决你的问题,请参考以下文章

当 UIAlertView 存在时,没有动画的方向会给出奇怪的结果

IOS开发之UIAlertView与UIAlertController的详尽用法说明

iOS:简单使用UIAlertVIew和UIActionSheet

iOS警报(UIAlertView)

iOS自定义提示弹出框(类似UIAlertView)

ios开发之oc-UIAlertView