swift - 存储弱引用有时会导致泄漏

标签 swift memory-leaks automatic-ref-counting

我有一个 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

最佳答案

尝试将变量设置为 unowned 而不是 weak。 这是一个 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) in ... 可能会解决这个问题。它是内置闭包的 swifts,但仍然是闭包,从技术上讲这可能导致它们嵌套。

尝试将您的代码更改为:

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

看看有没有帮助

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

还有任何机会,您可以粘贴代码而不是截屏,因为重新创建代码比重新输入代码更容易。

关于swift - 存储弱引用有时会导致泄漏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51340583/

相关文章:

ios - iOS 6.0 ARC下需要释放GCD队列吗?

swift - swift 中的结构可以有一个复制构造函数吗

ios - 如何在 iOS 和 Swift 中的 Collection View Cell 中停止捕获 session

c - 如何让 valgrind 报告 "where"发生 "definitely lost"

memory-leaks - MPI 内存泄漏

ios - 想要 ARC 的自动释放生命周期

ios - 将对象分配给 Objective-C 中的弱引用?

ios - 'GMSReverseGeocodeCallback!'类型的reverseGeocodeCooperative()函数的回调处理程序的示例是什么?

ios - UITableViewController 中的按钮将数据发送到 detailViewController - swift

c++ - QFileDialog内存泄漏?