2011-09-01 78 views
0

簡要介紹我正在嘗試做什麼。EXC_BAD_ACCESS在桌面之間來回切換時出錯

我使用的tableView:didSelectRowAtIndexPath方法:這是從捕像這樣該視圖行選擇我的UITableViewController子類中,方法...

//..... inside tableView:didSelectRowAtIndexPath: 
if (indexPath.section == 0) { 
     //--- Get the subview ready for use 
     VehicleSearchResponseTableViewController *vehicleSearchResponseTableViewController = [[VehicleSearchResponseTableViewController alloc] initWithNibName:@"VehicleSearchResponseTableViewController" bundle:nil]; 
     // ... 
     //--- Sets the back button for the new view that loads 
     self.navigationItem.backBarButtonItem = [[[UIBarButtonItem alloc] initWithTitle:@"Back" style: UIBarButtonItemStyleBordered target:nil action:nil] autorelease]; 
     // Pass the selected object to the new view controller. 
     [self.navigationController pushViewController:vehicleSearchResponseTableViewController animated:YES]; 

     if(indexPath.row == 0) { 
      vehicleSearchResponseTableViewController.title = @"Mans"; 

      EngineRequests *engineRequest = [[EngineRequests alloc] init]; 
      [engineRequest getMans]; 
      [engineRequest release]; 
     } 
     if(indexPath.row == 1) { 
//.... etc etc 

正如你可以在這個方法中看到我設置了幾個將新視圖推入視圖堆棧並更改後退按鈕文本,然後我會捕獲不同的行,然後在nsobject的子類中啓動一個方法,以便讓我的所有連接/請求都繼續運行。

在我的NSObject裏面我有幾種不同的方法可以在UITableViewController上選擇不同的單元格,基本上他們指定了不同的字符串,然後初始化我的ASIHTTPRequest包裝器來連接到php腳本並捕獲所有的數據將從數據庫中回來.. NSObject看起來像這樣。

//.... NSObject.m 
- (IBAction) getMans 
{ 
    NSString *mansString = [[NSString alloc] initWithString:@"mans.php"]; 
    [self grabURLInBackground:mansString]; 
    [manusString release]; 
} 
//....cont.... 
//--- Connect to server and send request ---------------->> 
- (IBAction)grabURLInBackground:(NSString *)setUrlString 
{ 
    NSString *startURL = [NSString stringWithFormat:@"http://127.0.0.1:8888/CodeTest/%@", setUrlString]; 
    NSURL *url = [NSURL URLWithString:startURL]; 
    ASIHTTPRequest *request = [ASIHTTPRequest requestWithURL:url]; 
    [request setDelegate:self]; 
    [request startAsynchronous]; 
} 

- (void)requestFinished:(ASIHTTPRequest *)request 
{ 
    NSString *responseString = [request responseString]; //Pass request text from server over to NSString 
    NSData *responseData = [responseString dataUsingEncoding:NSUTF8StringEncoding]; //Create NSData object for Parser Delegate and load with responseString 
    NSLog(@"stuff %@",responseData); 

} 

- (void)requestFailed:(ASIHTTPRequest *)request 
{ 
    NSError *error = [request error]; 
    NSLog(@"%@", error); 
} 

在這裏,我想通過我從requestFinished方法找回了對新推的UITableView ..的數據。但是我有一個錯誤,我能夠遠遠得到這一點,我需要解決之前...如果我運行模擬器並在視圖之間來回切換(主單元格爲UITableViewController,然後在彈出的視圖中我想放置數據),應用程序將會崩潰並彈出一個錯誤main。 m線程1:程序接收信號EXC_BAD_ACCESS ..我只是不知道是什麼原因造成的,因爲從我可以告訴我的代碼不是那麼糟糕。

另外,當我調試我的應用程序時,我注意到,一旦grabURLInBackground方法已完成,它彈回到getMans方法,然後返回到UITableViewController並繼續通過if語句,完全忽略requestFinished和requestFailed方法,而我只是無法弄清楚爲什麼。

我想我不知道我是否在正確的地方調用了我需要使用的方法和函數,所以如果您對如何改進或者如果您知道我的錯誤將在何處形成任何建議或答案將不勝感激。

回答

0

很難從簡要的概述中得知,但通常當你使用bad_access並以主應用程序方法結束時,通常是因爲你自動釋放了一些東西,然後釋放它,當autorelease池被耗盡時,它變得瘋狂。可能想打開NSZombiesEnabled並查找內存問題。

+0

只是一個快速的說明,以同意使用儀器或NSZombiesEnabled的東西來尋找殭屍也將是一個很好的方式來開始調試這種事情! – gdawg

+0

啊,我會研究這一點,我一直在使用產品>分析和看到一些潛在的內存泄漏,我已經修復..但會尋找這個殭屍的東西。 –

1

上面的代碼有幾個問題,但我猜你的訪問異常異常是由於處理你的EngineRequests和使用AsiHttpRequest。

這裏

EngineRequests *engineRequest = [[EngineRequests alloc] init]; 
[engineRequest getMans]; 
[engineRequest release]; 

代碼有效地創建那麼物體就getMans運行完畢後會釋放。

然後engineRequest對象這個代碼

[request setDelegate:self]; 
[request startAsynchronous]; 

請求是AsiHttpRequest 通知幾乎肯定釋放的對象一旦請求已完成內部。

這裏可能還有其他問題,但我會重新開始嘗試保留這個對象,直到它至少在收到來自AsiHttpRequest的響應之後。

+0

...我會如何解決這個問題..會autorelease做竅門? –

+0

您需要一種方法來確保engineRequest掛起,直到至少在http請求完成後。我可能會在視圖中創建engineRequest並將其保留爲對象變量,然後在請求返回時釋放它。在這種情況下,自動釋放可能只會讓事情更難調試。 – gdawg

+0

好的,謝謝你的幫助。我想我將把這個EngineRequests放到我的新UItableview中,並根據我從父窗口設置的視圖的標題進行更改,這樣我可以將一個視圖用於多個不同的結果集。 –

0

誰收到您的要求?

發送方(和接收方)對象是engineRequest。 但你釋放那一刻引擎請求您發出異步請求(由getMans法的男子後,

我建議你 1.將代碼

vehicleSearchResponseTableViewController.title = @"Mans"; 

    EngineRequests *engineRequest = [[EngineRequests alloc] init]; 
    [engineRequest getMans]; 
    [engineRequest release]; 
UITableViewController's didSelectRowAtIndexPath方法

方法您vehicleSearchResponseTableViewControllerviewDidLoad方法。 2.保留您EngineRequests對象,並在vehicleSearchResponseTableViewController保持它在一些實例變量和不釋放之前,該請求被處理完畢,成功或錯誤。

+0

我知道你是什麼意思..但是,該表中的數據可以改變在父視圖中選擇哪個單元格的深度。我試圖加載不同的數據,取決於哪個單元格被選入一個UITableViewController。 –

+0

是的,但是通過在http請求完成之前釋放engineRequest對象,您將在最好的情況下永遠不會收到數據,並且在最糟糕的情況下,您可能會導致訪問異常中止。 –