2012-09-05 258 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

我相信你已經試過有內存泄漏的儀器。用殭屍工具嘗試一下儀器,你可以很容易地在儀器庫中找到它。 用這個工具運行你的代碼,如果這個崩潰是因爲任何殭屍對象,那麼你將很容易檢測到這個位置。

它幫了我很多次。