【发布时间】:2018-05-20 16:36:28
【问题描述】:
这是一个使用 ReactiveSwift 的 Swift 类,将 MutableProperty 包装在 Property 中,并在 ScopedDisposable 中添加对该 Property 的订阅:
class Leaker {
let mutableProperty = MutableProperty<Int>(0)
var wrapperProperty: Property<Int> {
return Property(self.mutableProperty)
}
private var disposable: ScopedDisposable<AnyDisposable>?
init() {
let disposable = CompositeDisposable()
disposable += self.wrapperProperty.producer
.startWithValues { value in
print("\(value)")
}
self.disposable = ScopedDisposable(disposable)
}
}
如果我给另一个类一个Leaker? 类型的属性,然后使用self.leaker = Leaker() 设置它,这会造成泄漏。通过“创建泄漏”,我的意思是它触发了泄漏工具,显示了一个标记为 Malloc 32 Bytes 的泄漏对象,以及一个包含 Leaker.init() 调用 Leaker.wrapperProperty.getter 的堆栈跟踪。
为什么会泄漏?我发现很难准确理解是什么导致此处分配的内存永远不会被释放。
其他一些可能有用的事实:
- 如果我直接订阅
mutableProperty,这不会泄漏 - 如果我将
mutableProperty包装在惰性属性而不是计算属性中,这不会泄漏 - 如果我创建一个临时的
Leaker,这不会泄漏,例如let _ = Leaker()
【问题讨论】:
-
你使用的是哪个版本的 ReactiveSwift? There used to be a false-positive memory leak issue that has since been fixed.
-
谢谢!我们使用的是 ReactiveSwift 2.0。将尝试新版本。
-
看起来是fixed in 2.0,所以也许这不是问题。
-
我也可以看到泄漏。但我不必释放
Leaker对象。如果我保留对Leaker对象的引用,它甚至会显示出来。堆栈跟踪显示Property.init(unsafeProducer: SignalProducer<Value, NoError>)作为源。
标签: ios swift memory-leaks reactive-cocoa reactive-swift