更改视图时ASIHTTPRequest异步崩溃

时间:2011-06-10 13:35:53

标签: iphone objective-c ios cocoa-touch ios4

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

这仅在请求发生时发生。

以下是我的代码:

-(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"]);

}

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

ASIHTTPRequest必须有一些东西,但我不知道它是什么?

由于

5 个答案:

答案 0 :(得分:3)

这段代码应该修复它:

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

答案 1 :(得分:1)

如果视图正在发布,那么您在请求中设置的委托现在无效。确保在视图dealloc上将委托设置为nil并停止请求。

答案 2 :(得分:0)

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

-

@Simon是对的,你需要将委托设置为nil。我会做的是:

  1. 在您的班级中创建ASIHTTPRequest媒体资源,并在ProcessXML方法中设置该媒体资源。这简化了内存管理,并确保请求对象在您需要时可以随时使用。
  2. 在您的dealloc方法和requestFinished方法中,将请求委托设置为nil并设置self.request = nil;
  3. 至少,您应该在requestFinished方法中将委托设置为nil,但是如果您在返回之前离开此视图控制器,则需要记住停止运行请求,因此设置它在dealloc方法中也为零。

答案 3 :(得分:0)

asirequest对象未被保留在任何位置,因此在ProcessXML返回后将被取消分配。

答案 4 :(得分:0)

NSZombieEnabled可以帮到你很多。您可以确定哪个对象导致EXC_BAD_ACCESS。