我正在使用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必须有一些东西,但我不知道它是什么?
由于
答案 0 :(得分:3)
这段代码应该修复它:
-(void) viewWillDisappear:(BOOL)animated {
[super viewWillDisappear:animated];
[request clearDelegatesAndCancel]
}
答案 1 :(得分:1)
如果视图正在发布,那么您在请求中设置的委托现在无效。确保在视图dealloc上将委托设置为nil并停止请求。
答案 2 :(得分:0)
当您离开当前视图时,是否要取消分配ASIHTTPRequest
对象?我的猜测是在释放视图控制器后调用委托方法。
-
@Simon是对的,你需要将委托设置为nil。我会做的是:
ASIHTTPRequest
媒体资源,并在ProcessXML
方法中设置该媒体资源。这简化了内存管理,并确保请求对象在您需要时可以随时使用。dealloc
方法和requestFinished
方法中,将请求委托设置为nil并设置self.request = nil;
至少,您应该在requestFinished
方法中将委托设置为nil,但是如果您在返回之前离开此视图控制器,则需要记住停止运行请求,因此设置它在dealloc
方法中也为零。
答案 3 :(得分:0)
asirequest
对象未被保留在任何位置,因此在ProcessXML
返回后将被取消分配。
答案 4 :(得分:0)
NSZombieEnabled可以帮到你很多。您可以确定哪个对象导致EXC_BAD_ACCESS。