存储弱参考有时会导致泄漏

Dam*_*ycz 9 memory-leaks automatic-ref-counting swift

我有class A一个存储optional weak variable到其他对象,这是一个subclassA.有时当我在这个变量中存储一些东西时,我会得到一个leak- 这很少发生,但确实如此.我正在分配这个变量forEach loop,但是在使用时我也在其他应用程序中发现了类似的泄漏weak var,所以我不认为循环与此有任何关系.负责任的图书馆是libswiftCore.dylib负责任的框架swift::RefCounts<swift::RefCountBitsT<(swift::RefCountInlinedness)1> >::formWeakReference().其他人有类似的问题吗?有什么办法可以解决这个问题吗?

在此输入图像描述

在此输入图像描述

在此输入图像描述

AD *_*ess 5

尝试设置变量,而不是将其weak设置为unowned。这是一种Swift错误,因为没有警告开发人员,他正在捕获嵌套闭包的强大引用,但是,unowned暂时将其设置为解决方法。

编辑1:https ://lists.swift.org/pipermail/swift-evolution/Week-of-Mon-20151207/001197.html

提到从这里的改进在这里

class ViewControllerBase: UIViewController {
let timer:DispatchSourceTimer = DispatchSource.makeTimerSource(flags: [], queue:  DispatchQueue(label: "q.q"))

deinit {
    NSLog("deinit of \(NSStringFromClass(type(of: self)))")
}

override func viewDidLoad() {
    super.viewDidLoad()

    timer.scheduleRepeating(deadline: .now(), interval: .seconds(1))

    timer.setEventHandler {
        UIView.animate(withDuration: 0.2) { [weak self] in
            self?.view.backgroundColor = UIColor.green
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这会以一种微妙的方式泄漏内存……即使只有以“弱”方式使用self,也会存在一个保留循环。这是因为嵌套的闭包捕获了在随后的闭包中使用的强大参考。

编辑2:我可能错了,但是OP正在使用changes.forEach闭包,然后另一个闭包与changes.added.forEach我可能错了,但这可能是导致整个问题的原因,也许[weak self] (cluster, change)在...中声明了它可能会消除问题。它是快速内置于闭包中的,但仍然是闭包,从技术上讲,这可能会使它们嵌套。

尝试将代码更改为:

changes.forEach{[weak self] (cluster, change) in
Run Code Online (Sandbox Code Playgroud)

看看是否有帮助

要么

changes.forEach{[unowned self] (cluster, change) in
Run Code Online (Sandbox Code Playgroud)

另外,您还可以粘贴代码而不是进行屏幕截图,因为重新创建代码而不是重新键入代码更容易。