Iphone 更改视图时ASIHTTPRequest异步崩溃
我正在使用ASIHttpRequest从xml文件接收数据。但是,在异步请求期间,只要我更改视图(使用导航控制器返回到上一个视图),应用程序就会崩溃,并在main.m上执行EXC_BAD_访问 只有在发出请求时才会发生这种情况 下面是我的代码: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
-(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