In Objective-C, we can init CADisplayLink with Proxy Pattern to break strong reference:
WeakProxy *weakProxy = [WeakProxy weakProxyForObject:self];
self.displayL
An better approach might be to invalidate the display link in
viewWill/DidDisappear, see also
for useful information.
If that is not an option: Make the proxy object inherit from NSObject
instead of NSProxy. An Objective-C solution is for example
given here
and that can easily be translated to Swift 3:
class JAWeakProxy: NSObject {
weak var target: NSObjectProtocol?
init(target: NSObjectProtocol) {
self.target = target
super.init()
}
override func responds(to aSelector: Selector!) -> Bool {
return (target?.responds(to: aSelector) ?? false) || super.responds(to: aSelector)
}
override func forwardingTarget(for aSelector: Selector!) -> Any? {
return target
}
}
which can then be used as
displayLink = CADisplayLink(target: JAWeakProxy(target: self),
selector: #selector(didRefresh(dpLink:)))
Your approach
weak var weakSelf = self
displayLink = CADisplayLink(target: weakSelf!, selector: #selector(displayDidRefresh(dpLink:)))
does not work because it unwraps weakSelf when the CADisplayLink
is initialized and passes a strong reference to self as the target.