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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/objective-c/24.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 更改视图时ASIHTTPRequest异步崩溃_Iphone_Objective C_Ios_Cocoa Touch_Ios4 - Fatal编程技术网

Iphone 更改视图时ASIHTTPRequest异步崩溃

Iphone 更改视图时ASIHTTPRequest异步崩溃,iphone,objective-c,ios,cocoa-touch,ios4,Iphone,Objective C,Ios,Cocoa Touch,Ios4,我正在使用ASIHttpRequest从xml文件接收数据。但是,在异步请求期间,只要我更改视图(使用导航控制器返回到上一个视图),应用程序就会崩溃,并在main.m上执行EXC_BAD_访问 只有在发出请求时才会发生这种情况 下面是我的代码: -(void)ProcessXML{ //Set url from string to url NSURL *theurl = [NSURL URLWithString:@"http://twitter.com/statuses/use

我正在使用ASIHttpRequest从xml文件接收数据。但是,在异步请求期间,只要我更改视图(使用导航控制器返回到上一个视图),应用程序就会崩溃,并在main.m上执行EXC_BAD_访问

只有在发出请求时才会发生这种情况

下面是我的代码:

-(void)ProcessXML{

    //Set url from string to url
    NSURL *theurl = [NSURL URLWithString:@"http://twitter.com/statuses/user_timeline/2smssupport.xml"];

    asirequest = [ASIHTTPRequest requestWithURL:theurl];
    [asirequest setDelegate:self];
    [asirequest startAsynchronous];

}


- (void)requestFinished:(ASIHTTPRequest *)request
{


    NSLog(@"Saving to Defaults");
    NSData *responseData = [request responseData];
    xmlSaved = responseData;

    prefs = [NSUserDefaults standardUserDefaults];
    [prefs setObject:responseData forKey:@"xmlDownload"];
    rssParser = [[RssParser alloc] loadXMLbyURL:xmlSaved];
    [self.tableView reloadData];
    NSLog(@"%@",[prefs dataForKey:@"xmlDownload"]);

}
processxml方法触发请求,然后在RequestFinished中处理接收到的数据

ASITPPrequest中一定有我遗漏的东西,但我不知道它是什么


谢谢

如果视图正在释放,则您在请求中设置的代理现在无效。确保在视图dealloc上将委托设置为nil,并停止请求。

如果视图正在释放,则在请求中设置的委托现在无效。请确保在视图dealloc上将委托设置为nil,并停止请求。

离开当前视图时是否取消分配
ASIHTTPRequest
对象?我的猜测是,委托方法是在视图控制器被释放后被调用的

--

@Simon说得对,您确实需要将委托设置为nil。我要做的是:

  • 在类中创建一个
    ASIHTTPRequest
    属性,并在
    ProcessXML
    方法中设置该属性。这简化了内存管理,并确保请求对象在您需要时仍然存在
  • dealloc
    方法和
    requestFinished
    方法中,将请求委托设置为nil,并将
    self.request=nil

  • 至少,您应该在
    requestFinished
    方法中将委托设置为nil,但如果您在返回前离开此视图控制器,则需要记住停止请求的运行,因此,在
    dealloc
    方法中将其也设置为nil。

    当您离开当前视图时,是否取消分配
    ASIHTTPRequest
    对象?我的猜测是,委托方法是在视图控制器被释放后被调用的

    --

    @Simon说得对,您确实需要将委托设置为nil。我要做的是:

  • 在类中创建一个
    ASIHTTPRequest
    属性,并在
    ProcessXML
    方法中设置该属性。这简化了内存管理,并确保请求对象在您需要时仍然存在
  • dealloc
    方法和
    requestFinished
    方法中,将请求委托设置为nil,并将
    self.request=nil

  • 至少,您应该在
    requestFinished
    方法中将委托设置为nil,但如果您在返回前离开此视图控制器,则需要记住停止请求的运行,因此,在
    dealloc
    方法中也将其设置为nil。

    ASIRESQUEST
    对象没有保留在任何位置,因此在
    ProcessXML
    返回后将其释放。

    ASIRESQUEST
    对象没有保留在任何位置,因此,在
    ProcessXML
    返回后,它将被解除分配。

    NSZombieEnabled对您有很大帮助。您可以判断是哪个对象导致EXC\u坏访问。

    NSZombieEnabled对您有很大帮助。您可以判断是哪个对象导致EXC\u BAD\u访问。

    这段代码应该可以修复它:

        -(void) viewWillDisappear:(BOOL)animated {
            [super viewWillDisappear:animated];
            [request clearDelegatesAndCancel]
         }
    

    这段代码应该可以修复它:

        -(void) viewWillDisappear:(BOOL)animated {
            [super viewWillDisappear:animated];
            [request clearDelegatesAndCancel]
         }
    


    我该怎么做?我已经在dealoc中将asirequest设置为nil,它仍然崩溃[asirequest setDelegate:nil];我收回这句话,它确实起作用了。。。但是现在它在asihttprequest类中的某个地方出现了EXC_BAD_访问错误打开僵尸-在可执行参数中将NSZombieEnabled添加到YES,并看到它断开的行,它将显示正在过度释放的对象…我该如何做?我已经在dealoc中将asirequest设置为nil,它仍然崩溃[asirequest setDelegate:nil];我收回这句话,它确实起作用了。。。但是现在它在asihttprequest类的某个地方出现了EXC_BAD_访问错误打开僵尸-在可执行参数中将NSZombieEnabled添加到YES,然后看到它断开的行,它将显示正在过度释放的对象…这可能是正确的,那么我将如何着手解决问题呢?iphone上的内存分配让我有些困惑,因为它是自我保留的,你不需要保留或释放它。但根据我的回答,您需要将委托设置为零。那么我需要在哪里将委托设置为零?在dealloc?@Simon中,更常见的术语是“自动删除”。当自动释放池在当前运行循环结束时耗尽时,它被标记为释放。“自我保留”意味着它可以在任意的时间内保持自己的存在,但它不能。我可以随时称之为[自我保留],然后称之为[自我释放]。我很清楚自动释放。。。查看我的简历;)这可能是正确的,那么我将如何着手解决这个问题呢?iphone上的内存分配让我有些困惑,因为它是自我保留的,你不需要保留或释放它。但根据我的回答,您需要将委托设置为零。那么我需要在哪里将委托设置为零?在dealloc?@Simon中,更常见的术语是“自动删除”。当自动释放池在当前运行循环结束时耗尽时,它被标记为释放。“自我保留”意味着它可以在任意的时间内保持自己的存在,但它不能。我可以随时称之为[自我保留],然后称之为[自我释放]。我很清楚自动释放。。。查看我的简历;)即使视图改变了?请求发生在一个看起来像后台线程的线程上。它是自我保留的,你不需要保留或释放它。@Simon Lee,你为什么这么说?我刚刚检查了文档和源代码,但在我看来不是这样。我的意思是请求是在主线程上发出的,但是所有的事情都是在后台进行的。T