iPhone应用程序随机使用exc_bad_access崩溃

时间:2012-09-05 11:59:02

标签: iphone ios exc-bad-access

我有一个带有四个标签的应用。在每个选项卡中,我使用nsurlconnection连接到远程服务器,获取响应并相应地显示。在测试应用程序时,我会随机崩溃。如果我再次尝试重现崩溃,我不会崩溃。我不明白崩溃的根本原因是什么。我启用NSZombie,符号化崩溃日志,检查内存泄漏但没有运气。

我在Xcode 3中启动了项目,现在我将相同的项目导入Xcode 4.2,那么Xcode的兼容性是否有任何问题?

我在所有标签中使用相同名称的nsurlconnection 在表1中,我将nsurlconnection定义为conn,将Tab 2定义为nsurlconnection为conn。

此定义是否会导致任何问题?

请帮我解决这个随机崩溃

       NSMutableURLRequest *request = [[NSMutableURLRequest alloc] initWithURL: url];

                conn = [[NSURLConnection alloc] initWithRequest:request delegate:self];


                if(label != nil){
                progressView = [[ProgressView showHUDAddedTo:self.tabBarController.view animated:YES] retain];
                    progressView.labelText = label;
                }

                [request release];
- (void)connection:(NSURLConnection *)connection didReceiveResponse:(NSURLResponse *)response {

            NSLog(@"didReceiveresponse");
            if ([response isKindOfClass: [NSHTTPURLResponse class]]) {

                if([(NSHTTPURLResponse *)response statusCode] == 200){

                }
                else{
                    //show Connection Error Alert
                }
            }
            responseData = [[NSMutableData alloc]init];
        }

        - (void)connection:(NSURLConnection *)connection didReceiveData:(NSData *)data {
            NSLog(@"didReceiveData");
            [responseData appendData:data];
        }

        - (void)connection:(NSURLConnection *)connection didFailWithError:(NSError *)error {

            [progressView hide:YES];

            NSLog(@"didFail");

           //show failed alert
        }

        - (void)connectionDidFinishLoading:(NSURLConnection *)connection {

            NSLog(@"didfinish loading");

            if([responseData length] > 0)
                {
    //handles response data

    }
    }

3 个答案:

答案 0 :(得分:0)

我没有看到代码的猜测就是在一个标签页面中你做了一个NSURLConnection并在完成时对结果做了一些事情。如果在返回结果之前更改选项卡,则会导致崩溃。

当viewDidDis出现时,您需要取消NSURLConnection,或者确保在完成后运行的任何代码都不包含任何可能导致崩溃的内容(如设置标签文本)(如设置标签文本)。 / p>

我处理这个的方式是,有一个单独的类来执行URL请求,当它完成时发送通知。在viewDidAppear方法中,您可以将viewController设置为侦听通知,并在viewDidDisapper方法中停止侦听通知。因此,如果在URL请求完成时您的视图不可见,则会触发通知,但不会发生任何事情。

答案 1 :(得分:0)

你能提供控制台的输出吗?这似乎不是Xcode的错误。 当您尝试访问已释放的对象时,通常会出现这些类型的错误。

答案 2 :(得分:0)

我相信你已经尝试了内存泄漏的仪器。尝试使用带有僵尸工具的乐器,您可以在乐器库中轻松找到它。 使用此工具运行您的代码,如果此崩溃是由于任何僵尸对象,那么您将能够轻松地检测到该位置。

它已帮我几次了。