【发布时间】:2020-09-11 16:03:22
【问题描述】:
假设如果我用代码创建一个 NSTimer。该代码调用了一个函数,该函数在 90 秒后关闭视图控制器
- A) 每次查看该视图时是否都需要 InValidate NSTimer 控制器解雇?
- B) 无效有什么用?以及何时 使用无效?
- C) 如果我不使用 invalidate 会导致任何方面 像内存泄漏这样的影响? (已编辑)
请解释一下。
【问题讨论】:
标签: ios objective-c nstimer
假设如果我用代码创建一个 NSTimer。该代码调用了一个函数,该函数在 90 秒后关闭视图控制器
请解释一下。
【问题讨论】:
标签: ios objective-c nstimer
如果您还没有,我建议您查看documentation for NSTimer,因为您的三个问题中有两个已经在此处得到了明确的回答(重点在我的下方):
A) 每次视图控制器关闭时是否需要 InValidate NSTimer?
比较重复和非重复计时器
您可以指定计时器在创建时是重复的还是不重复的。 非重复计时器触发一次,然后自动失效,从而防止计时器再次触发。相比之下,重复计时器会触发,然后在同一运行循环中重新安排自己 [...]
B) 无效有什么用?以及何时使用 invalidate ?
停止计时器
停止计时器再次触发并请求将其从运行循环中移除。
C) 如果我不使用 invalidate 是否会导致任何副作用,例如内存泄漏? (已编辑)
上面链接的文档没有明确说明使用NSTimer 的这个特定方面,但是一个简单的搜索产生了一个关于NSTimer 相关内存管理的特别有用的Stack Overflow question。我在下面的accepted answer 中包含了最相关的内容:
是的,
NSTimer将保持对target的强引用,这可能会导致(尤其是在重复计时器中)强引用周期(也称为保留周期)。但是,在您的示例中,计时器不会重复,并且仅延迟 0.5,因此在最坏的情况下,您将拥有一个强大的参考周期,它将在 0.5 秒内自动解决。但未解决的强引用循环的常见示例是 有一个
UIViewController和一个重复的NSTimer属性, 但是因为NSTimer对UIViewController,控制器最终会被保留。所以,如果您将
NSTimer保留为实例变量,那么, 是的,你应该invalidate它,解决强引用 循环。如果你只是打电话给scheduledTimerWithTimeInterval, 但不将其保存到实例变量中(正如人们可能推断的那样 你的例子),那么你的强参考周期将在什么时候得到解决NSTimer已完成。
【讨论】: