asihttprequest崩溃我的应用程序

时间:2011-04-18 09:50:46

标签: 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]) {

很多案例都会跳到:

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

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

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;  

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

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

4 个答案:

答案 0 :(得分:12)

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

答案 1 :(得分:4)

错误是委托仍然设置。

我找到了两种解决方法。

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

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

答案 2 :(得分:3)

ASIHTTPRequest你找不到更好的东西,问题就是你如何使用它,导航代表消失是一个常见的问题。

听起来你的问题与处理由于用户导航而被销毁的队列的viewcontroller有关。我发现解决这些问题的最佳方法是使用一个中央模型类来处理我的所有通信,并在整个应用程序生命周期中保持该类。

这样,当代表们意外消失时,你不会得到无法解释的崩溃。

选项2

另一种方法可以是禁用用户导航,直到网络操作完成。在整个屏幕上放置一个模态视图,显示一个uiactivityview,以便用户知道他们的操作被阻止。然后,您可以在数据到达时淡出模态视图。如果您使用渐变设计好屏幕,那么背景会略微变暗,这看起来还不错。但它并不是最好的方法 - 你应该修改代表AWOL。

我们可能需要查看更多与队列创建,销毁等相关的代码才能找到确切的问题。

答案 3 :(得分:1)

您的应用程序委托可以拥有一组请求队列。该阵列独立于导航控制器堆栈和相关视图的状态。您可以将请求添加到应用程序委托队列实例,或者停止所有请求并清空队列等,而不是将请求绑定到导航堆栈中的视图控制器,并且必须执行UI技巧以阻止弹出回到父视图。