NSRunLoop runUntilDate导致应用程序崩溃。

5

我有一个应用程序在Snow Leopard服务器上运行了数天和数周。 它使用-[NSRunLoop runUntilDate:]来“暂停”十秒钟,执行其任务,然后再次暂停。在运行了一个多小时后,我的应用程序崩溃并生成以下报告:

崩溃报告

Exception Type:  EXC_BAD_ACCESS (SIGSEGV)
Exception Codes: KERN_INVALID_ADDRESS at 0x0000000000000013
Crashed Thread:  0  Dispatch queue: com.apple.main-thread

Application Specific Information:
objc_msgSend() selector name: release

Thread 0 Crashed:  Dispatch queue: com.apple.main-thread
0   libobjc.A.dylib                 0x00007fff84cfef0c objc_msgSend + 40
1   com.apple.CoreFoundation        0x00007fff84e363d1 __CFRunLoopDoSources0 + 1361
2   com.apple.CoreFoundation        0x00007fff84e345c9 __CFRunLoopRun + 873
3   com.apple.CoreFoundation        0x00007fff84e33d8f CFRunLoopRunSpecific + 575
4   com.apple.Foundation            0x00007fff83e73b74 -[NSRunLoop(NSRunLoop)  runMode:beforeDate:] + 270
5   com.apple.Foundation            0x00007fff83ebf19a -[NSRunLoop(NSRunLoop) runUntilDate:] + 78

乍一看,我以为我的NSRunLoop对象不再有效,因此CF内部的release消息导致崩溃。但是,我认为这并不是问题,因为我在前一行获取了对currentRunLoop对象的引用。
崩溃时间在1到1.5小时之间变化,但我无法确定是什么原因导致的。 如果您有任何评论、意见或调试想法,将不胜感激,因为我不知道下一步该怎么做。
编辑:问题已解决——请参见下面的答案

你能否贴出那个失败方法的一些代码? - NJones
2个回答

6
进一步的测试使我得以回答自己的问题:
运行循环没有任何问题。运行循环处理自动释放池中的对象释放,这就是为什么代码的任何部分的问题都可能与运行循环有关。
在我的情况下,我有一个未被正确清理的对象。在正常情况下,这个问题会在内存泄漏测试中显示出来。然而,在实际客户端安装时,当SMTP服务器返回一个意外的错误消息时,这个特定问题才会出现,导致一个对象“留下来”,当运行循环试图清理它时,它停滞不前。
简短的答案:
运行循环中的崩溃可能由代码中的任何对象引起。尝试重新创建问题场景并测试内存泄漏以找到罪犯。

5
我知道这并不完全回答了你的问题,但是...
我不确定是否有样例代码,但你考虑过NSTimer吗?它们非常容易使用来每n秒执行一次代码。
self.myTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(timerTarget:) userInfo:nil repeats:YES];

其中myTimer是您的类的NSTimer属性。

当您完成并不再需要调用时。

[self.myTimer invalidate];
self.myTimer = nil;

谢谢 - 我知道NSTimer并在其他应用程序中使用它。这肯定是其中一种解决方案,但我更愿意找出NSRunLoop或者我的代码中可能存在的其他问题。 - helioz

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接