iPhone 崩溃 - 消息发送到已释放的实例

2023-12-07

好的,这是我收到的错误:

    -[CFRunLoopTimer invalidate]: message sent to deallocated instance 0x109b05a0 (gdb)

这是导致崩溃的代码:

    if (waitingOpponentTimer) {
      [waitingOpponentTimer invalidate]; //<-- Crash/error occurs here
      waitingOpponentTimer = nil;
    }

以及其他地方:

    NSTimer* waitingOpponentTimer;

并且:

    waitingOpponentTimer = [NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(waitingOpponentTimeOut)userInfo:nil repeats:NO];

任何地方都没有发生 waitingOpponentTimer ,只有我上面显示的那些。 waitingOpponentTimeOut 操作仅设置一些变量,对计时器或 waitingOpponentTimer 不执行任何操作。

我已尝试以下所有 IF 语句来防止到达无效语句:

    if (waitingOpponentTimer) {
    if ([waitingOpponentTimer retainCount] > 0) {
    if (waitingOpponentTimer.isValid) {
    if (waitingOpponentTimer != nil) {

但在所有情况下,它仍然会通过 IF 语句,然后使用 invalidate 语句导致崩溃。

所以我的问题是,当对象 isValid 且不为 nil 并且其保留计数大于零时,为什么/如何 invalidate 会导致错误?

是否有另一种方法来检查这一点以防止达到无效状态?

我对 iPhone 编程完全是菜鸟,我花了几个小时在谷歌上搜索试图弄清楚这一点,但无法弄清楚我做错了什么。任何帮助和建议表示赞赏!

编辑: 只是为了澄清一下,我使用它在计时器运行之前手动停止计时器。我知道如果它用完,它就会自行失效,这就是为什么我使用 IF 语句来检查它是否已经失效(但它不起作用)。所以我认为当崩溃发生时计时器已经失效了,但是我如何检查它是否已经失效?

编辑: 好的,我在下面标记了正确答案。我不知道当计时器未被保留并且本身已经失效时,代码通过 IF 语句获取是否确实有原因,但答案是如果要在 IF 语句中使用计时器,则始终使用 RETAIN 。

以下是相关信息:如果不需要使其失效,是否有理由保留预定的 NSTimer?


你用ARC吗?

waitingOpponentTimer = [[NSTimer scheduledTimerWithTimeInterval:10.0f target:self selector:@selector(waitingOpponentTimeOut)userInfo:nil repeats:NO] retain];
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

iPhone 崩溃 - 消息发送到已释放的实例 的相关文章

随机推荐