2012-10-03 116 views
1

我已經搜索了一段時間,並嘗試了很多東西,但是我不能讓這個錯誤消失。我有一個通過下拉方法刷新的表格。我也使用蘋果的可達性來確定互聯網連接。當我使用互聯網運行我的應用程序,然後在應用程序運行時關閉互聯網,我的應用程序崩潰嘗試顯示UIAlertView。雖然,當我在沒有互聯網的情況下啓動我的應用程序,然後在應用程序運行時打開互聯網並關閉它時,應用程序不會崩潰,並且所有應用程序都按原樣運行。任何幫助將不勝感激。iOS UIAlertView給出EXC_BAD_ACCESS

錯誤發生在[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]; 
} 
+0

在您的alertView上嘗試[autorelease]而不是發佈 – Jessedc

+0

當您開啓殭屍時會發生什麼?你說所有其他警報視圖正常工作?你是不是也在說導致這次事故的那個人在某些時候工作?最後,一切是在主線上運行的嗎? –

+0

確定它是由警報?註釋並測試它。 –

回答

0

我使用sendAsynchronousRequest測試了以下方法:queue:completionHandler:作爲從URL下載數據的方法。它似乎工作正常,我可以得到else子句觸發,無論是通過搞亂URL或超時間隔0.1秒。

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]; 
     } 
    }]; 
+0

太棒了。這應該可以。I'l我明天測試一下。 –

0

你有兩個問題:

  1. 你不應該使用可達性,以確定是否有互聯網連接。可達性僅用於確定離線連接何時重新聯機。真。撥打網絡電話有時足以啓動無線電和連接,因此如果您嘗試預先檢查是否有互聯網連接,收音機將保持關閉狀態。

  2. 第二個問題是沒有在主線程上進行同步網絡調用。這包括Reachability和[NSData dataWithContentsOfURL:xxx]。使用Grand Central Dispatch,NSOperationQueues,NSURLConnections或NSThreads在輔助線程上創建它們。否則,如果網絡狀態不佳,系統監視程序計時器將會終止您的應用程序,您的應用程序可能會鎖定。

+0

你如何建議我檢查互聯網連接呢? –

+1

你不檢查。您建立連接,如果失敗,則處理失敗。無論如何,你必須處理失敗,所以這不是更多的工作,而只是一種不同的思考方式。 – EricS

+0

是的,這是有道理的。我會努力改變它。你知道爲什麼我的AlertView失敗嗎?我應該沒有任何關係...... –