微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

在iOS的NSTimer中使用无效吗? 停止计时器

如何解决在iOS的NSTimer中使用无效吗? 停止计时器

假设我用代码创建一个NSTimer。这段代码调用60秒后关闭视图控制器的函数

NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 60.0 target: self
                                   selector: @selector(callAfterSixtySecond:) userInfo: nil repeats: NO];
  • A)每次查看该视图时,是否需要使NSTimer无效 管理员解雇了?
  • B)invalidate的用途是什么?什么时候去 使用无效吗?
  • C)如果我不使用无效,它将导致任何一方 记忆泄漏等效果? (编辑)

请解释。

解决方法

如果您还没有的话,我建议您复习documentation for NSTimer,因为在那里三个问题中的两个已经清楚地回答了(重点在我的下方):


A)每当视图控制器关闭时,是否有必要使NSTimer无效?

比较重复和不重复计时器

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


B)invalidate的用途是什么?以及何时使用无效?

停止计时器

  • invalidate

    阻止计时器再次触发,并要求将其从运行循环中删除。


C)如果我不使用无效,是否会引起诸如内存泄漏的副作用? (已编辑)

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

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

但未解决的强参考周期的一个常见示例是 具有UIViewController属性且重复的NSTimer属性, 但由于NSTimer强烈引用了 UIViewController,该控制器最终将被保留。

因此,如果您将NSTimer保留为实例变量,那么, 是的,您应该invalidate使用它来解决强引用 周期。如果您只是打电话给scheduledTimerWithTimeInterval, 而不是将其保存到实例变量(如可能从 您的示例),那么当 NSTimer已完成。

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。