2012-09-05 209 views
1

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

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

而且我在所有标签中使用nsurlconnection的相同名称,如 在标签1中,我将nsurlconnection定义为conn,而标签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 

    } 
    } 

回答

0

我的猜测没有看到代码,将是一个标签的制造NSURLConnection的和做,结果什么它完成时。如果在返回结果之前更改标签,则会导致其崩溃。

当viewDidDisappear时,您需要取消NSURLConnection,或者确保完成时运行的任何代码不包含导致崩溃(如果该选项卡不可见)的任何内容(如设置标签文本)。

我处理这个问题的方式是有一个单独的类,它执行完成时发送通知的URL请求。这样在你的viewDidAppear方法中,你设置你的viewController来侦听通知,并且在viewDidDisapper方法中你停止侦听通知。因此,如果您的视图在URL请求完成时不可见,则会触发通知,但没有任何反应。

+0

在哪里取消nsurlconnection? – MobileDev

+0

在阅读了更多内容之后,您可能无法取消请求。所以你需要做的是确保何时请求完成它什么都不做,因为我猜目前它试图更新不同标签上的UI? – Darren

+0

显示请求完成时调用的代码 – Darren

0

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

+0

分段错误11在从相机捕捉图像时主要发生崩溃。 – MobileDev

0

我相信你已经试过有内存泄漏的仪器。用僵尸工具尝试一下仪器,你可以很容易地在仪器库中找到它。 用这个工具运行你的代码,如果这个崩溃是因为任何僵尸对象,那么你将很容易检测到这个位置。

它帮了我很多次。