We're trying to use Swift structs where we can. We are also using RxSwift which has methods which take closures. When we have a struct that creates a closure that refers to self, that creates a strong reference cycle.
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)
}
}
How do I know this? If I create 100,000 DoesItLeak objects and call someFoo() on each of them, I believe I have 100,000 objects with strong reference cycles. In other words, when I get rid of the DoesItLeak array containing those objects, the objects stay in memory. If I do not call someFoo(), there is no problem.
Variable is a class. So, I can see this memory issue by using xcode's Instruments' Allocations and filtering in Variable< String >
If I try to use [weak self] such as in the following, I get a compiler error:
someVariable.subscribeNext { [weak self] person in
The compiler error is "weak cannot be applied to non-class type"
In real/non-example code, we access methods and variables via self and it's a memory issue.
How can I resolve this memory issue while keeping the DoesItLeak a struct?
Thanks for your help.
question from:
https://stackoverflow.com/questions/34406196/swift-struct-memory-leak 与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…