在tableviews之间来回切换时出现EXC_BAD_ACCESS错误

时间:2011-09-01 02:28:25

标签: iphone ios asihttprequest nsobject

简要概述我正在尝试做什么。

我在我的UITableViewController子类中使用tableView:didSelectRowAtIndexPath:方法,它正在从该视图中捕获行选择,如此...

//..... 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 <中弹出错误/ strong>线程1:程序接收信号EXC_BAD_ACCESS ..我只是不知道是什么造成的,因为我可以告诉我的代码并不是那么糟糕。

另外,当我调试我的应用程序时,我注意到一旦grabURLInBackground方法完成它就会跳回到getMans方法,然后返回到UITableViewController并继续通过if语句,完全忽略了requestFinished和requestFailed方法,而我只是无法弄清楚原因。

我想我不确定我是否正在调用我需要在正确位置使用的方法和功能,所以如果你对我如何改进有任何建议或答案,或者如果你知道我的错误将来自何处非常感谢。

3 个答案:

答案 0 :(得分:1)

上面的代码有一些问题,但我猜你的错误访问异常是由于你的EngineRequests的处理和使用AsiHttpRequest。

这里的代码

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

有效地创建一个对象,然后在getMans运行完毕后立即解除分配。

然后在engineRequest对象此代码

[request setDelegate:self];
[request startAsynchronous];
请求完成后,

请求AsiHttpRequest 通知几乎肯定已发布的对象

这里可能还有其他问题,但我会从重组开始尝试保持这个对象,至少在收到AsiHttpRequest的响应之后。

答案 1 :(得分:0)

很难从简短的概述中看出,但通常当你bad_access并最终进入主应用程序方法时,通常是因为你自动释放了一些东西,然后释放它,并且当自动释放池被耗尽时它会崩溃。可能想打开NSZombiesEnabled并寻找内存问题。

答案 2 :(得分:0)

谁接到您的请求?

发送方(和接收方)对象是engineRequest。 但是在你发出异步请求之后的那一刻你发布了Engine Request(由getMans方法提供。)

我会建议你 1.移动代码

    vehicleSearchResponseTableViewController.title = @"Mans";

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

从您的UITableViewController's didSelectRowAtIndexPath方法到vehicleSearchResponseTableViewController的{​​{1}}方法。 2.保留viewDidLoad对象并将其保留在EngineRequests中的某个实例变量中,并且在请求完成处理之前不要成功或错误地释放它。