gpt4 book ai didi

ios - 毫无疑问,当 Controller 消失时,您是否必须使 CADisplayLink 失效()?

转载 作者:可可西里 更新时间:2023-11-01 05:01:25 27 4
gpt4 key购买 nike

假设您每天都有一个 CADisplayLink

class Test: UIViewController {

private var _ca : CADisplayLink?

@IBAction func frames() {

_ca?.invalidate()
_ca = nil

_ca = CADisplayLink(
target: self,
selector: #selector(_step))
_ca?.add(to: .main, forMode: .commonModes)
}

@objc func _step() {

let s = Date().timeIntervalSince1970
someAnime.seconds = CGFloat(s)
}

最终 View Controller 被关闭。

有没有人真正明确地知道,

当 View Controller 被关闭时,您是否必须显式调用 .invalidate()(实际上是 nil _ca)?

(所以也许在 deinit 或 viewWillDisappear 中,或任何你喜欢的。)

文档毫无值(value),而且我不够聪明,无法查看源代码。我从来没有找到任何人真正、明确地知道这个问题的答案。

是否必须显式无效,如果 VC 消失,它是否会保留并继续运行?

最佳答案

运行循环保持对添加到它的任何显示链接的强引用。参见 add(to:forMode:)文档:

The run loop retains the display link. To remove the display link from all run loops, send an invalidate() message to the display link.

并且显示链接保持对其目标 的强引用。参见 invalidate()文档:

Removing the display link from all run loop modes causes it to be released by the run loop. The display link also releases the target.

因此,您肯定需要invalidate()。如果您使用 self 作为显示链接的 target,则不能在 deinit 中执行此操作(因为 CADisplayLink 保持对其目标的强引用)。


如果在 View Controller 中执行此操作,一个常见的模式是在 viewDidAppear 中设置显示链接并在 viewDidDisappear 中删除它。

例如:

private weak var displayLink: CADisplayLink?

override func viewDidAppear(_ animated: Bool) {
super.viewDidAppear(animated)
startDisplayLink()
}

override func viewDidDisappear(_ animated: Bool) {
super.viewDidDisappear(animated)
stopDisplayLink()
}

private func startDisplayLink() {
stopDisplayLink() // stop previous display link if one happens to be running

let link = CADisplayLink(target: self, selector: #selector(handle(displayLink:)))
link.add(to: .main, forMode: .commonModes)
displayLink = link
}

private func stopDisplayLink() {
displayLink?.invalidate()
}

@objc func handle(displayLink: CADisplayLink) {
// do something
}

关于ios - 毫无疑问,当 Controller 消失时,您是否必须使 CADisplayLink 失效()?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47368609/

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