NSRunloop runUntilDate导致应用程序崩溃

hel*_*ioz 4 macos cocoa objective-c osx-snow-leopard nsrunloop

我有一个可以在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
Run Code Online (Sandbox Code Playgroud)

乍一看,我以为我的NSRunLoop对象不再有效,因此releaseCF中深处的消息会导致崩溃。但是,我认为情况并非如此,因为我之前获得了对currentRunLoop对象的引用。

崩溃时间在1到1.5小时之间变化,但是我无法确定是什么原因造成的。由于我不确定下一步该怎么做,因此将不胜感激任何评论或意见或调试想法。

编辑:问题解决-请在下面查看我的答案

NJo*_*nes 5

我知道这并不能准确回答您的问题,但是...

我不确定这是否是一个选项,因为没有示例代码,但是您是否考虑过 NSTimer?它们非常易于使用,可以每 n 秒执行一次代码。

self.myTimer = [NSTimer scheduledTimerWithTimeInterval:4 target:self selector:@selector(timerTarget:) userInfo:nil repeats:YES];
Run Code Online (Sandbox Code Playgroud)

其中 myTimer 是您班级的 NSTimer 属性。

完成后,不想再打电话了。

[self.myTimer invalidate];
self.myTimer = nil;
Run Code Online (Sandbox Code Playgroud)


hel*_*ioz 5

进一步的测试使我能够回答自己的问题:

运行循环没有任何问题。这是运行循环,它处理释放自动释放池中的对象,这就是为什么代码任何部分的问题都可以显示与运行循环有关的原因。

就我而言,我有一个未正确清理的对象。通常情况下,在内存泄漏测试期间会出现此问题。但是,此特定问题仅在实际的客户端安装上出现,这是因为SMTP服务器返回了意外错误消息,该错误消息导致对象被“遗留”,并且当运行循环最终尝试对其进行清理时,它陷入了停顿。

简短答案

代码中的任何对象都可能导致运行循环崩溃。尝试重新创建问题方案并测试内存泄漏以找到违规者。