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(),就没有问题。
Variable是一个类。因此,我可以使用Xcode的Instruments' Allocations并过滤Variable<String>来查看这个内存问题。
如果我尝试使用[weak self],如下所示,我会收到编译器错误:
someVariable.subscribeNext { [weak self] person in
编译器错误是"weak cannot be applied to non-class type"。
在真实的代码中,我们通过self访问方法和变量,这是一个内存问题。
如何解决这个内存问题,同时保持DoesItLeak为结构体?
谢谢你的帮助。
Variable
类型是一个类还是结构体? - Marc KhadpesomeVariable
属性被弱引用捕获的方法,但我不知道有这样的方法。 - Marc KhadpeDoesItLeak
是一个值类型,这意味着它只能存在于堆栈帧上。那么我们将什么作为闭包的“self”参数传递?我们会传递指向堆栈帧上对象的指针,然后希望这个堆栈帧在闭包执行时仍然存在。你实际上可以在Swift中这样做,但这是完全不安全的。我们希望DoesItLeak
是一个值类型,但一旦它被传递给引用计数对象的闭包,它就必须成为引用计数的值类型。因此,DoesItLeak
不能是一个结构体。 - Darren