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

标签 swift weak-references cadisplaylink

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

相关文章:

ios - 在通过代码呈现的另一个 ViewController 上呈现 AlertController

swift - ViewController 未按预期执行 segue

ios - Http get with Swift-2 中的查询参数

即使 self 保持存在,Swift 弱引用也会变为 nil

c# - 是否需要 static List<WeakReference>?

ios - CADisplayLink 可以在应用程序处于后台时运行吗?

objective-c - 使用 CADisplayLink 作为动态频率定时器

ios - Swift: TableView 父类(super class)错误

ios - 哪些对象弱引用了我的 ViewController?

ios - CADisplayLink 在 iOS5.1 上运行较低的帧率