gpt4 book ai didi

swift - 强、弱引用+镜像: causing leak

转载 作者:搜寻专家 更新时间:2023-10-31 22:17:33 28 4
gpt4 key购买 nike

下面的 Parent 类具有对单个子对象的强引用和弱引用。永远不会释放子对象。移除弱引用, child 就被释放了。

需要调用 Mirror 方法来进行此泄漏,但我不明白为什么使用 Mirror 会导致此行为。镜像的结果不保留。

对于弱引用和强引用,只有父 deinit 被执行!

Parent deinit

我希望看到父对象和子对象都被释放,因此日志显示:

Parent deinit
DeinitLogger deinit

删除弱引用,日志显示两个对象 deinit,正如预期的那样。

你能帮我理解为什么会泄漏吗? (这不是 Playground ,而是在应用程序中)。

class DeinitLogger {
deinit {
print("DeinitLogger \(#function)")
}
}

class Parent: NSObject {

weak var weakLogger: DeinitLogger?
var strongLogger: DeinitLogger

override init() {

let logger = DeinitLogger()

// Create a weak ref
weakLogger = logger // comment out this line, no leak!

// Create a strong ref to same object.
strongLogger = logger

super.init()

// Invoking mirror and adding the properties to a dict leaks when one of the
// properties is weak.
let dict = dictionaryOfProps()
print(dict)
}

deinit {
print("Parent \(#function)")
}

/// Generates a dictionary of property names -> properties
/// e.g. "strongLogger" -> type of strongLogger.
private func dictionaryOfProps() -> [String: Any] {
var result = [String: Any]()
let mirror = Mirror(reflecting: self)
for case let(label?, value) in mirror.children {
result[label] = value
}
return result
}
}

// Chuck these two lines in a viewDidLoad(), or anywhere.
var o: Parent? = Parent()
o = nil // everything should be freed here.

最佳答案

这是 Swift 4.2 (Xcode 10) 中的一个已知错误:

在读取 ReflectionMirror.m 中的弱引用时由于缺少版本导致.该错误已在 master 分支上修复。您的程序使用来自 https://swift.org/download/#releases 的当前“Trunk Development (master)”快照正确运行.

关于swift - 强、弱引用+镜像: causing leak,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54099562/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com