Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/38.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在表视图之间来回切换时出现EXC_BAD_访问错误_Iphone_Ios_Asihttprequest_Nsobject - Fatal编程技术网

Iphone 在表视图之间来回切换时出现EXC_BAD_访问错误

Iphone 在表视图之间来回切换时出现EXC_BAD_访问错误,iphone,ios,asihttprequest,nsobject,Iphone,Ios,Asihttprequest,Nsobject,对我正在尝试做的事情的简要概述 我在UITableViewController子类中使用tableView:DidSelectRowatineXpath:方法,该子类从该视图捕获行选择,如下所示 //..... inside tableView:didSelectRowAtIndexPath: if (indexPath.section == 0) { //--- Get the subview ready for use VehicleSearchRespons

对我正在尝试做的事情的简要概述

我在UITableViewController子类中使用tableView:DidSelectRowatineXpath:方法,该子类从该视图捕获行选择,如下所示

//..... 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
正如您在这个方法中所看到的,我设置了一些东西,将新视图推到viewstack上,并更改back按钮文本,然后我开始捕捉不同的行,然后在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\u BAD\u访问中弹出错误。。我只是不知道;我不知道是什么原因造成的,因为从我能告诉我的代码不是那么糟糕

此外,当我调试应用程序时,我注意到一旦grabURLInBackground方法完成,它会跳回getMans方法,然后返回UITableViewController,并继续执行if语句,完全忽略requestFinished和requestFailed方法,我无法理解原因


我想我不确定我是否调用了需要在正确位置使用的方法和函数,因此如果您对我如何改进有任何建议或答案,或者您知道我的错误来自何处,我将不胜感激。

从简要概述中很难分辨,但一般来说,当您访问错误并最终进入主应用程序方法时,这通常是因为您自动释放了某些内容,然后将其释放,当自动释放池耗尽时,这些内容就会消失。可能需要启用NSZombiesEnabled并查找内存问题

上面的代码有一些问题,但我猜您的坏访问异常是由于处理EngineRequests和使用AsiHttpRequest造成的

这里的代码

EngineRequests *engineRequest = [[EngineRequests alloc] init];
[engineRequest getMans]; 
[engineRequest release]; 
有效地创建一个对象,然后在getMans完成运行后立即释放

然后在engineRequest对象中此代码

[request setDelegate:self];
[request startAsynchronous];
请求AsiHttpRequest在请求完成后通知几乎肯定已释放的对象


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

谁收到了您的请求

发送方(和接收方)对象是engineRequest。 但在发出异步请求(由getMans方法的mens发出)之后,您就在那个时刻释放了引擎请求

我建议你 1.移动代码

    vehicleSearchResponseTableViewController.title = @"Mans";

    EngineRequests *engineRequest = [[EngineRequests alloc] init];
    [engineRequest getMans]; 
    [engineRequest release]; 
UITableViewController的
didSelectRowAtIndexPath方法到
vehiclesearchrresponsetableviewcontroller的
viewDidLoad
方法。
2.保留您的
引擎请求
对象,并将其保存在
VehicleSearchResponseSetableViewController
中的某个实例变量中,并且在请求被完全处理之前(无论是成功还是错误)不要释放它。

请注意,同意使用仪器或NSZombiesEnabled工具来查找zoMBIE也是开始调试这类东西的一个很好的方法!啊,对了,我会研究一下,我一直在使用产品>分析,看到了一些我已经修复的潜在内存泄漏..但是我会寻找这个僵尸的东西。我知道你的意思..但是表中的数据可以改变父表中选择哪个单元格视图。我正在尝试加载不同的数据,具体取决于在一个UITableViewController中选择了哪个单元格。是的,但是在http请求完成之前释放engineRequest对象,在最好的情况下,您将永远不会收到数据,在最坏的情况下,您可能会面临访问失败的风险。您需要一种方法来确保engineRequest挂起在您的周围直到http请求完成。我可能会在视图中创建engineRequest,并将其作为对象变量保留,然后在请求返回后将其释放。在这种情况下,自动释放可能只会使调试更加困难。好的,谢谢您的帮助。我想我会将此EngineRequests放入我的新建UItableview,并根据父视图设置的视图标题对其进行更改,这样我可以将一个视图用于多个不同的结果集。