asihttprequest崩溃我的应用程序

Tra*_*hor 9 iphone crash asihttprequest

我有一个基于导航的应用程序.按主视图上的按钮,然后我将新视图推送到导航控制器.所有非常基本的东西.

加载新视图时,我执行ASIHTTPRequest来获取一些json数据,这是一个图像URL列表.然后我做一个for循环,创建一堆ASIHTTPRequests,将它们添加到队列然后运行队列.

但是如果我在队列结束前单击后退按钮,应用程序崩溃了,这个应用程序会显示房屋,让我们说你选错了房子,在显示任何照片之前很快点击回来,bumm崩溃.

这个主题http://groups.google.com/group/asihttprequest/browse_thread/thread/3d4815198aa889b9解释了我的问题,除了我确实取消了视图上的所有请求卸载,将委托设置为nil并释放队列.

我还是崩溃了.如果我使用3G,每次都会崩溃,但是在wifi上真的很难让它崩溃,但是非常可行.

在几乎80%的实例中,调试器在ASIHTTPRequest.m中跳转到此行

(void)requestReceivedResponseHeaders:(NSMutableDictionary *)newResponseHeaders { 
  if ([self error] || [self mainRequest]) { return; }  
--> if (delegate && [delegate respondsToSelector:didReceiveResponseHeadersSelector]) {
Run Code Online (Sandbox Code Playgroud)

很多情况下它会跳到:

(void)requestReceivedResponseHeaders:(NSMutableDictionary *)newResponseHeaders { 
  if ([self error] || [self mainRequest]) { return; }    
---> if (delegate && [delegate respondsToSelector:didReceiveResponseHeadersSelector]) {  
Run Code Online (Sandbox Code Playgroud)

广告在少数情况下进入我的主循环

int main(int argc, char *argv[]) {  
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init]; 
--> int retVal = UIApplicationMain(argc, argv, nil, nil); with SIGBART error [pool release]; return retVal;  
Run Code Online (Sandbox Code Playgroud)

我正在使用MBP和MacPro,最新的OS X,Xcode 4.0.2,我测试除了原始iPhone之外的所有苹果设备.

我真的不想重写我的整个应用程序,但是还有什么比ASIHTTPRequest更好吗?

Dan*_*Ray 12

尝试取消和取消设置委托-viewWillUnload而不是-viewDidUnload.我怀疑它实际卸载的时间窗口(在调用这两个UIViewController方法之间)是你可以崩溃的时间段.委托已经离开,但您还没有告诉您的ASIHTTPRequest对象.

  • 在viewWillDissapear中,似乎已经完成了这个伎俩,至少我无法让它崩溃.我确实添加了以下代码,只是为了确定: - (void)viewWillDisappear:(BOOL)animated {[super viewWillDisappear:animated]; for(ASIHTTPRequest*req in [queue operations]){[req clearDelegatesAndCancel]; [req setDelegate:nil]; [req setDidFailSelector:nil]; [req setDidFinishSelector:nil]; } [queue cancelAllOperations]; [queue setDelegate:nil]; } (6认同)

Tra*_*hor 4

错误是委托仍然被设置。

我找到了两种方法来解决这个问题。

我认为丑陋的方式是,您创建一个通用委托来处理所有网络流量,并在应用程序首次运行时实例化。我实际上使用了应用程序委托并收听 nsnotification 中心消息。它的工作原理就像一个魅力,应用程序永远不会崩溃,但我认为它不是最佳的。

最好的方法是不设置委托,也不使用“setDidFinishSelector”,而是使用“setCompletionBlock:^”。这仅适用于运行 iOS 4.0 及更高版本的设备,该比例超过 90-95%,并且还在不断增长。这是一个很棒的方法,不会使应用程序崩溃。