在 Objective-C 中,我们可以使用代理模式初始化 CADisplayLink 来打破强引用:
WeakProxy *weakProxy = [WeakProxy weakProxyForObject:self];
self.displayLink = [CADisplayLink displayLinkWithTarget:weakProxy selector:@selector(displayDidRefresh:)];
然后,只需在dealloc
中使displayLink 无效:
- (void)dealloc
{
[_displayLink invalidate];
}
然而,NSProxy 似乎无法在 Swift 中被继承:https://bugs.swift.org/browse/SR-1715
我试着这样写:
weak var weakSelf = self
displayLink = CADisplayLink(target: weakSelf!, selector: #selector(displayDidRefresh(dpLink:)))
没用。
我想知道是否有任何方法可以像在 Objective-C 中那样实现这一点。
最佳答案
更好的方法可能是使显示链接无效
viewWill/DidDisappear
,另见
获取有用的信息。
如果这不是一个选项: 使代理对象继承自 NSObject
而不是 NSProxy
。例如,Objective-C 解决方案
在这里给出
这可以很容易地转换为 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
}
}
然后可以用作
displayLink = CADisplayLink(target: JAWeakProxy(target: self),
selector: #selector(didRefresh(dpLink:)))
你的方法
weak var weakSelf = self
displayLink = CADisplayLink(target: weakSelf!, selector: #selector(displayDidRefresh(dpLink:)))
不起作用,因为它在 CADisplayLink
时解包 weakSelf
被初始化并传递对 self
的强引用作为目标。
关于swift - 如何使用目标和 CADisplayLink 实例之间的弱引用在 Swift 中设置 CADisplayLink,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44096793/