我有一个在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小时之间变化,但我无法理解导致它的原因。 任何评论或意见或调试的想法将不胜感激,因为我不知道下一步该做什么。
编辑:问题解决 - 请参阅下面的答案
答案 0 :(得分:4)
我知道这并没有准确回答你的问题,但是......
我不确定这是否是一个选项,因为没有示例代码,但您考虑过NSTimer吗?它们非常容易用于每隔n秒执行一次代码。
self.myTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(timerTarget:) userInfo:nil repeats:YES];
其中myTimer是您班级的NSTimer属性。
完成后,不再需要电话。
[self.myTimer invalidate];
self.myTimer = nil;
答案 1 :(得分:4)
进一步的测试使我能够回答我自己的问题:
运行循环没有问题。正是运行循环处理释放自动释放池中的对象,这就是为什么代码的任何部分的问题都可以显示与运行循环相关的原因。
在我的情况下,我有一个没有正确清理的物体。在正常情况下,在内存泄漏测试期间会出现此问题。但是,当SMTP服务器返回意外的错误消息导致对象“遗留”并且运行循环最终尝试清理它时,实际的客户端安装才会出现此特定问题,它会停止运行。
运行循环中的崩溃可能是代码中的任何对象引起的。尝试重新创建问题场景并测试内存泄漏以找到罪犯。