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

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了存储弱参考有时会导致泄漏相关的知识,希望对你有一定的参考价值。

我有一个class A存储optional weak variable到其他对象,这是subclassA。有时当我在这个变量中存储一些东西时,我会得到一个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

答案

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

编辑1: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) ...可能会删除该问题。它是内置的swift,但仍然是一个闭包,从技术上讲它可以嵌套。

尝试将代码更改为:

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

看看是否有帮助

要么

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

您也可以粘贴代码而不是屏幕截图,因为它更容易重新创建代码而不是重新输入代码。

以上是关于存储弱参考有时会导致泄漏的主要内容,如果未能解决你的问题,请参考以下文章

在片段中保存活动实例:是否会导致内存泄漏?

Swinject:使用弱范围会泄漏对象

使用导致内存泄漏的音频片段

ThreadLocal 内存泄露的根本原因

带有 UI 和内存泄漏的保留片段

为啥lua语言中使用全局变量就会造成内存泄漏