Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/37.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone ASIHTTPRequest和僵尸。。。_Iphone_Ios_Debugging_Asihttprequest_Nszombie - Fatal编程技术网

Iphone ASIHTTPRequest和僵尸。。。

Iphone ASIHTTPRequest和僵尸。。。,iphone,ios,debugging,asihttprequest,nszombie,Iphone,Ios,Debugging,Asihttprequest,Nszombie,已解决(我认为):在弹出vc后(在dealloc中),将AsiTRequest委托/NSOperationQueue委托设置为nil 在我开始之前,问题是相似的,但不是相同的 我的应用程序即将发布,但这是在整个开发过程中存在的唯一一个持久性错误。这也是向某人演示应用程序时出现的唯一一个错误,由于该错误导致应用程序终止,因此非常令人尴尬。如果有人能找到解决办法(永远),我将奖励一笔相当大的赏金 问题的开头: 基本上,当ASIHTTPRequest试图调用requestFinished选择器到一个

已解决(我认为):在弹出vc后(在dealloc中),将AsiTRequest委托/NSOperationQueue委托设置为nil

在我开始之前,问题是相似的,但不是相同的

我的应用程序即将发布,但这是在整个开发过程中存在的唯一一个持久性错误。这也是向某人演示应用程序时出现的唯一一个错误,由于该错误导致应用程序终止,因此非常令人尴尬。如果有人能找到解决办法(永远),我将奖励一笔相当大的赏金


问题的开头:

基本上,当ASIHTTPRequest试图调用
requestFinished
选择器到一个僵尸对象上时,就会出现这个错误

环顾四周,ASIHTTPRequest在向僵尸发送选择器时,似乎会将其发送到一个类似的非僵尸对象。我听说很常见的情况是,它将选择器发送到它要发送到的控制器的CALayer,而我也将其发送到我的UINavigationButton!?-无论如何,这样做的结果是它抛出了一个异常

当ASIHTTPRequest类尝试调用“requestFinished”选择器时,该问题发生在该类内部:

[queue performSelector:@selector(requestFinished:) withObject:self];
那一行代码就是它失败的那一行——让我困惑的是为什么?关于我链接到的问题,OP说他们通过从视图控制器调用
[self-retain]
解决了这个问题。这肯定不对吗

结构

ASIHTTPRequest的工作方式是将它们添加到下载队列(NSOperationQueue),该队列位于我的应用程序委托中。我的应用程序的结构/风格主要基于,这与flickr RSS提要的功能非常相似

我的应用程序中使用ASIHTTPRequest的部分是一个网络摄像头查看器。它有一个导航控制器,在中有一个表视图,其中显示三个网络摄像头。这些图像是JPEG格式的,每30秒更新一次静态文件(在远程服务器上)。此表视图中的单元格是自定义的,每个单元格都加载自己的ASIHTTPRequest。细胞下载各自的图像,并显示它们

以下是我创建的方法,该方法在我的每个单元格上调用:

- (void)loadURL:(NSURL *)url {
    ASIHTTPRequest *request = [[ASIHTTPRequest alloc] initWithURL:url];
    [request setDelegate:self];
    [request setDidFinishSelector:@selector(requestDone:)];
    [request setDidFailSelector:@selector(requestWentWrong:)];
    NSOperationQueue *queue = [[MyAppDelegate sharedAppDelegate] downloadQueue];
    [queue addOperation:request];
    [spinner startAnimating];
    [self addSubview:spinner];
    [request release];  
}
当选择其中一个单元格时,它会将用户带到详细视图,在该视图中加载ASIHTTPRequest的另一个实例,该实例将下载所选网络摄像头的图像

错误是如何触发的

在我的应用程序的正常“平静”使用下,它表现良好。当这些视图之间(根视图和详细网络摄像头视图之间)发生快速推送和弹出时,就会出现问题如果您输入详细视图,进度条开始移动,然后再次弹出到根目录,则最常发生这种情况。这使我相信,由于控制器未处于活动状态,当ASIHTTPRequest完成并尝试调用控制器时,它会失败

崩溃日志

Exception Type:  EXC_BAD_ACCESS (SIGBUS)
Exception Codes: KERN_PROTECTION_FAILURE at 0x00000480
Crashed Thread:  0

Thread 0 Crashed:
0   libobjc.A.dylib                 0x30183f24 objc_msgSend + 24
1   iCompton                        0x0003c4d4 0x1000 + 242900
2   CoreFoundation                  0x35ea3f72 -[NSObject(NSObject) performSelector:withObject:] + 18
3   iCompton                        0x00029082 0x1000 + 163970
4   CoreFoundation                  0x35ea3f72 -[NSObject(NSObject) performSelector:withObject:] + 18
5   Foundation                      0x33fd3e66 __NSThreadPerformPerform + 266
6   CoreFoundation                  0x35ebc8ca __CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__ + 8
7   CoreFoundation                  0x35e8cec6 __CFRunLoopDoSources0 + 378
8   CoreFoundation                  0x35e8c6f2 __CFRunLoopRun + 258
9   CoreFoundation                  0x35e8c504 CFRunLoopRunSpecific + 220
10  CoreFoundation                  0x35e8c412 CFRunLoopRunInMode + 54
11  GraphicsServices                0x35261d1c GSEventRunModal + 188
12  UIKit                           0x33865574 -[UIApplication _run] + 580
13  UIKit                           0x33862550 UIApplicationMain + 964
14  iCompton                        0x00002b92 0x1000 + 7058
15  iCompton                        0x00002b44 0x1000 + 6980

  • 如果你读到这里,谢谢
  • 如果你能回答,我会更加感谢你
  • 如果你解决了我的问题,赏金:)

您不应该在实时应用程序中使用NSZombieEnabled,内存永远不会释放。不在开发中时,需要将其关闭。快速推拉可能会耗尽内存,触发内存警告,并导致释放和解除锁定。不过,在你发布崩溃日志之前,我们无法确定

如果输入详细视图,进度条开始移动,然后再次弹出到根目录,则通常会发生这种情况。这使我相信,由于控制器未处于活动状态,当ASIHTTPRequest完成并尝试调用控制器时,它会失败

我认为你在这方面是正确的

当您跳转到根控制器(或任何其他控制器)时,您应该尝试取消ASIHTTPRequest。在取消请求之前,应将其
委托
设置为零;或者您可以使用
ClearDelegates和Cancel

这可能需要您在视图控制器中保留对请求的引用,但这应该没有问题


关于检测弹出的UIViewController,一个有趣的S.O.问题/答案是。

我是如何解决这个问题的:在viewController的
dealloc
方法中将任何未完成的
asihtpRequest
委托设置为
nil

这阻止了未完成的
asihtpRequest
s在viewController从导航堆栈弹出和
dealloc
'd后向viewController上的
didfishselector
s、
didFailSelector
s等发送消息


请记住:
ASIHTTPRequest
方法
cancelAllOperations
可能会异步调用
didFailSelector
。在这种情况下,选择器可能会在不再存在的viewController上调用。

我只通过仪器测试了一次僵尸。。。我只是用术语zombie来指过度释放的对象。我现在将发布崩溃日志。嗨,很好,我可以丢弃请求,因为每个网络摄像头都使用相同的细节控制器,所以尝试保存请求将毫无意义。无论如何,你如何检测pop(不仅仅是查看将消失)…我不知道你是否可以取消请求,无论如何,我编辑了我的答案以添加有关检测pop的信息…抱歉,我的意思是通过“破坏请求”删除委派我只是看了代码。。。我意识到在ViewWillEnglish中,我第一次写这篇文章时使用的示例代码是将downloadProgressDelegate设置为nil,那么为什么不将delegate设置为nil呢现在可以完美地工作了(在我做的小测试中)。。。经过几天的测试,我将奖励你+50赏金,非常感谢