gpt4 book ai didi

swift - 如何使用目标和 CADisplayLink 实例之间的弱引用在 Swift 中设置 CADisplayLink

转载 作者:可可西里 更新时间:2023-11-01 00:35:40 26 4
gpt4 key购买 nike

在 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/

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