假设我用代码创建了一个NSTimer。该代码调用一个函数,该函数在90秒后解除视图控制器
- A(当视图管制员解雇
- B( 无效有什么用?以及何时使用失效
- C( 如果我不使用无效会引起任何方面像内存泄漏这样的影响?(已编辑(
请解释。
如果您还没有,我鼓励您查看NSTimer
的文档,因为您的三个问题中有两个在那里得到了明确的回答(重点在我下面(:
A(每次视图控制器关闭时是否需要InValidate NSTimer?
比较重复计时器和非重复计时器
您可以指定计时器在创建时是重复还是不重复非重复计时器触发一次,然后自动失效,从而防止计时器再次触发。相比之下,一个重复计时器触发,然后在同一个运行循环上重新安排自己[…]
B(无效有什么用?什么时候使用失效?
停止计时器
invalidate
停止计时器再次启动,并请求将其从运行循环中删除。
C(如果我不使用invalide,它会引起任何副作用,比如内存泄漏吗?(编辑(
上面链接的文档并没有明确说明使用NSTimer
的这一特定方面,但一个简单的搜索就产生了一个关于NSTimer
相关内存管理的特别有用的堆栈溢出问题。我已经包含了以下公认答案中最相关的内容:
是的,
NSTimer
将保持对target
的强引用,这可能会导致(尤其是在重复定时器中(强引用周期(也称为保留周期(。然而,在您的示例中,计时器不会重复,并且仅延迟0.5,因此在最坏的情况下,您将有一个强大的参考周期,它将在0.5秒内自动解析。但未解决的强参考周期的一个常见例子是为了具有重复的具有CCD_ 8属性的CCD_,但由于CCD_ 9具有对
UIViewController
,控制器最终将被保留。因此,如果您保留
NSTimer
作为实例变量,那么,是的,你应该invalidate
它,以解决强引用周期如果您只是在呼叫scheduledTimerWithTimeInterval
,但不将其保存到实例变量中(正如从你的例子(,那么你的强参考周期将在则CCD_ 14完成。