【问题标题】:Using invalidate in NSTimer in iOS? [closed]在 iOS 的 NSTimer 中使用无效? [关闭]
【发布时间】:2020-09-11 16:03:22
【问题描述】:

假设如果我用代码创建一个 NSTimer。该代码调用了一个函数,该函数在 90 秒后关闭视图控制器

  • A) 每次查看该视图时是否都需要 InValidate NSTimer 控制器解雇?
  • B) 无效有什么用?以及何时 使用无效?
  • C) 如果我不使用 invalidate 会导致任何方面 像内存泄漏这样的影响? (已编辑)

请解释一下。

【问题讨论】:

    标签: ios objective-c nstimer


    【解决方案1】:

    如果您还没有,我建议您查看documentation for NSTimer,因为您的三个问题中有两个已经在此处得到了明确的回答(重点在我的下方):


    A) 每次视图控制器关闭时是否需要 InValidate NSTimer?

    比较重复和非重复计时器

    您可以指定计时器在创建时是重复的还是不重复的。 非重复计时器触发一次,然后自动失效,从而防止计时器再次触发。相比之下,重复计时器会触发,然后在同一运行循环中重新安排自己 [...]


    B) 无效有什么用?以及何时使用 invalidate ?

    停止计时器

    • invalidate

      停止计时器再次触发并请求将其从运行循环中移除。


    C) 如果我不使用 invalidate 是否会导致任何副作用,例如内存泄漏? (已编辑)

    上面链接的文档没有明确说明使用NSTimer 的这个特定方面,但是一个简单的搜索产生了一个关于NSTimer 相关内存管理的特别有用的Stack Overflow question。我在下面的accepted answer 中包含了最相关的内容:

    是的,NSTimer 将保持对target 的强引用,这可能会导致(尤其是在重复计时器中)强引用周期(也称为保留周期)。但是,在您的示例中,计时器不会重复,并且仅延迟 0.5,因此在最坏的情况下,您将拥有一个强大的参考周期,它将在 0.5 秒内自动解决。

    但未解决的强引用循环的常见示例是 有一个 UIViewController 和一个重复的 NSTimer 属性, 但是因为NSTimerUIViewController,控制器最终会被保留。

    所以,如果您将 NSTimer 保留为实例变量,那么, 是的,你应该invalidate它,解决强引用 循环。如果你只是打电话给scheduledTimerWithTimeInterval, 但不将其保存到实例变量中(正如人们可能推断的那样 你的例子),那么你的强参考周期将在什么时候得到解决 NSTimer 已完成。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多