In Objective-C, we can init CADisplayLink with Proxy Pattern to break strong reference:
WeakProxy *weakProxy = [WeakProxy weakProxyForObject:self];
self.displayL
This proxy class should just work. Don't forget to invalidate before the dealloc.
import UIKit
class CADisplayLinkProxy {
var displaylink: CADisplayLink?
var handle: (() -> Void)?
init(handle: (() -> Void)?) {
self.handle = handle
displaylink = CADisplayLink(target: self, selector: #selector(updateHandle))
displaylink?.add(to: RunLoop.current, forMode: .common)
}
@objc func updateHandle() {
handle?()
}
func invalidate() {
displaylink?.remove(from: RunLoop.current, forMode: .common)
displaylink?.invalidate()
displaylink = nil
}
}
Usage:
class ViewController: UIViewController {
var displaylinkProxy: CADisplayLinkProxy?
override func viewDidLoad() {
super.viewDidLoad()
displaylinkProxy = CADisplayLinkProxy(handle: { [weak self] in
self?.updateAnything()
})
}
@objc func updateAnything() {
print(Date())
}
}