如何解决在iOS的NSTimer中使用无效吗? 停止计时器
假设我用代码创建一个NSTimer。这段代码调用60秒后关闭视图控制器的函数
NSTimer* myTimer = [NSTimer scheduledTimerWithTimeInterval: 60.0 target: self
selector: @selector(callAfterSixtySecond:) userInfo: nil repeats: NO];
请解释。
解决方法
如果您还没有的话,我建议您复习documentation for NSTimer
,因为在那里三个问题中的两个已经清楚地回答了(重点在我的下方):
A)每当视图控制器关闭时,是否有必要使NSTimer无效?
比较重复和不重复计时器
您指定计时器在创建时是重复还是不重复。 非重复计时器触发一次,然后自动使自身失效,从而防止计时器再次触发。相比之下,重复计时器会触发,然后在同一运行循环上重新安排自身的时间[...]
B)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 举报,一经查实,本站将立刻删除。