我们正在尝试尽可能使用 Swift 结构。我们还使用了 RxSwift,它具有采用闭包的方法。当我们有一个结构体创建一个引用自身的闭包时,就会创建一个强引用循环。
import Foundation
import RxSwift
struct DoesItLeak {
var someState: String = "initial value"
var someVariable: Variable<String> = Variable("some stuff")
let bag = DisposeBag()
mutating func someFoo() {
someVariable.subscribeNext { person in
self.someState = "something"
}
.addDisposableTo(bag)
}
}
我怎么知道这个?如果我创建 100,000 个 DoesItLeak 对象并在每个对象上调用 someFoo(),我相信我有 100,000 个具有强引用周期的对象。换句话说,当我删除包含这些对象的DoesItLeak 数组时,这些对象会保留在内存中。如果我不调用 someFoo(),就没有问题。
变量是一个类。因此,我可以通过使用 xcode 的 Instruments' Allocations 并在Variable< String >中过滤来查看此内存问题
如果我尝试使用如下所示的 [weak self],则会收到编译器错误:
someVariable.subscribeNext { [weak self] person in
编译器错误是“弱不能应用于非类类型”
在实际/非示例代码中,我们通过 self 访问方法和变量,这是一个内存问题。
如何在保持 DoesItLeak 结构的同时解决此内存问题?
谢谢你的帮助。