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

时间:2018-07-14 14:55:10

标签: swift memory-leaks automatic-ref-counting

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

enter image description here

enter image description here

enter image description here

1 个答案:

答案 0 :(得分:4)

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

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

这里here提到的改进之处:

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
        }
    }
}

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

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

尝试将您的代码更改为:

changes.forEach{[weak self] (cluster, change) in

看看是否有帮助

changes.forEach{[unowned self] (cluster, change) in

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