【问题标题】:NSRunloop runUntilDate causes application crashNSRunloop runUntilDate 导致应用程序崩溃
【发布时间】:2011-10-19 00:42:14
【问题描述】:

我有一个在 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 小时之间变化,但我不知道是什么原因造成的。 任何 cmets 或意见或调试想法将不胜感激,因为我不确定下一步该做什么。

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

【问题讨论】:

  • 你能从失败的方法中发布一些代码吗?

标签: objective-c macos cocoa osx-snow-leopard nsrunloop


【解决方案1】:

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

我不确定这是否是一个选项,因为没有示例代码,但是您是否考虑过 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 出了什么问题,或者我的代码中可能有其他问题。
【解决方案2】:

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

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

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

简短的回答

运行循环中的崩溃可能是由代码中的任何对象引起的。尝试重新创建问题场景并测试内存泄漏以找到违规者。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-10-21
    • 2016-06-04
    • 2011-08-24
    • 2014-05-03
    • 1970-01-01
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    相关资源
    最近更新 更多