【问题标题】:How to check if NSTimer has been already invalidated如何检查 NSTimer 是否已经失效
【发布时间】:2010-09-26 23:08:18
【问题描述】:

如果用户点击按钮或退出视图,我需要使 NSTimer 对象无效。

所以我有:

[myNSTimer invalidate];

在我的按钮处理程序和viewWillDisappear 内部。如果用户点击按钮然后存在视图,则应用程序会抛出异常,因为myNSTimer 已经失效。 我需要在viewWillDisappear 方法中做的是检查myNSTimer 是否已失效。我该怎么做?

我试过了:

if(myNSTimer != nil)
  [myNSTimer invalidate];

但这没有用。

【问题讨论】:

    标签: ios objective-c iphone cocoa-touch nstimer


    【解决方案1】:

    一旦您使计时器无效,只需在其上调用release(假设您保留了您所持有的引用),然后取消您的引用。这样,当您退出视图时,再次尝试使计时器无效只会在 nil 上调用该方法,而不会执行任何操作。

    或者,您可以使用-[NSTimer isValid] 在无效之前检查它是否有效,但是在第一次无效之后确实没有理由保留您的参考。此外,如果您的真正问题是您没有保留引用,因此第一个 -invalidate 实际上给您留下了指向已释放对象的引用,那么调用 -isValid 无论如何也无济于事。

    【讨论】:

    • 这正是我的message sent to deallocated instance 问题的解决方案。谢谢。
    【解决方案2】:

    我通常做的是将持有计时器的成员变量置零,无论是在它触发时,还是在我使其无效时。然后你可以这样做:

    [myNSTimer invalidate]; 
    myNSTimer = nil;
    

    它会做正确的事。

    【讨论】:

      【解决方案3】:

      我在尝试暂停和重新启动计时器时遇到了同样的问题。停止它:

      [timer invalidate];
      [timer release];
      timer = nil;
      

      并启动/重新启动它:

      timer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(aSelector) userInfo:nil repeats:YES] retain];
      

      现在当我使其无效时它不会崩溃。

      【讨论】:

        【解决方案4】:

        斯威夫特:

        if timer.valid {
           timer.invalidate()
        }
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-08-21
          • 2020-07-07
          • 2017-09-06
          相关资源
          最近更新 更多