gpt4 book ai didi

iphone - 使 UIViewController 中的 NSTimer 无效以避免保留周期的最佳时间

转载 作者:太空狗 更新时间:2023-10-30 03:08:50 26 4
gpt4 key购买 nike

有谁知道什么时候是停止在 UIViewController 内部引用的 NSTimer 的最佳时间,以避免计时器和 Controller 之间的保留循环?

这里是更详细的问题:我在 UIViewController 中有一个 NSTimer。

在 View Controller 的 ViewDidLoad 期间,我启动计时器:

statusTimer = [NSTimer scheduledTimerWithTimeInterval: 1 target: self selector: @selector(updateStatus) userInfo: nil repeats: YES];

上面的代码导致计时器持有对 View Controller 的引用。

现在我要释放我的 Controller (例如父 Controller 释放它)

问题是:我可以在哪里调用 [statusTimer invalidate] 以强制计时器释放对 Controller 的引用?

我试着把它放在 ViewDidUnload 中,但是直到 View 收到内存警告时它才会被触发,所以这不是一个好地方。我试过 dealloc,但只要计时器还活着,dealloc 就永远不会被调用(先有鸡还是先有蛋的问题)。

有什么好的建议吗?

最佳答案

  1. 您可以避免保留周期,例如,将计时器对准包含非保留(弱)引用的StatusUpdate 对象到你的 Controller ,或者通过一个 StatusUpdater 用你的 Controller 的指针初始化,持有一个弱引用,并为你设置计时器。

    • 当目标窗口为 nil(应该处理您提供的 -viewDidDisappear: 的反例)以及 -viewDidDisappear: 中的反例。这确实意味着您的 View 正在返回到您的 Controller ;如果您愿意,您可以通过向 Controller 发送 -view:willMoveToWindow: 消息或发布通知来避免伸手去抢计时器。

    • 大概是您导致 View 从窗口中移除,因此您可以在驱逐 View 的行旁边添加一行以停止计时器。 p>

    • 您可以使用非重复计时器。它会在触发后立即失效。然后,您可以在回调中测试是否应创建一个新的非重复计时器,如果是,则创建它。不需要的保留周期只会将定时器和 Controller 对保持到下一个触发日期。有了 1 秒的触发日期,您就不必担心太多。

除了第一个建议之外的每一个建议都是接受保留循环并在适当的时候打破它的方法。第一个建议实际上避免了保留周期。

关于iphone - 使 UIViewController 中的 NSTimer 无效以避免保留周期的最佳时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3478361/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com