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

swift – 存储弱引用有时会导致泄漏,第1张

概述我有一个类A,它将一个可选的弱变量存储到其他对象,这是A的子类.有时当我在这个变量中存储一些东西时,我得到一个泄漏 – 这种情况很少发生,但确实如此.我在forEach循环中分配这个变量,但是在使用弱变量时我也在其他应用程序地点发现了类似的泄漏,所以我不认为循环与此有任何关系.负责任的库是lib swiftCore.dylib,负责的框架是swift :: RefCounts< swift :: 我有一个类A,它将一个可选的弱变量存储到其他对象,这是A的子类.有时当我在这个变量中存储一些东西时,我得到一个泄漏 – 这种情况很少发生,但确实如此.我在forEach循环中分配这个变量,但是在使用弱变量时我也在其他应用程序地点发现了类似的泄漏,所以我不认为循环与此有任何关系.负责任的库是lib swiftCore.dylib,负责的框架是swift :: RefCounts< swift :: RefCountBitsT<(swift :: RefCountInlinedness)1> > :: formWeakReference().其他人有类似的问题吗?有什么办法可以解决这个问题吗?

尝试设置变量而不是弱,将其设置为无主.
这是一个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的闭包我可能是错的,但这可能是整个问题的原因,也许是在那里声明它[弱自我](集群,变化) in …可能会删除这个问题.它是内置的swift,但仍然是一个闭合,从技术上讲它可以嵌套.

尝试将代码更改为:

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

看看是否有帮助

要么

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

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

总结

以上是内存溢出为你收集整理的swift – 存储弱引用有时会导致泄漏全部内容,希望文章能够帮你解决swift – 存储弱引用有时会导致泄漏所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: https://outofmemory.cn/web/1035051.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存