Swift Struct Memory Leak Swift Struct Memory Leak swift swift

Swift Struct Memory Leak


As Darren put it in the comments: "DoesItLeak can't be a struct" We cannot have the DoesItLeak be a struct and safely resolve the strong reference cycle issue.

Value types like structs exist on the stack frame. Closures and classes are reference types.

As the Strong Reference Cycles for Closures section puts it:

This strong reference cycle occurs because closures, like classes, are reference types.

Since the struct has the Variable class and the closure referring to self is stored into the Variable class using subscribeNext, it creates the strong reference cycle. See "Resolving Strong Reference Cycles for Closures" in Automatic Reference Counting Apple documentation.


For anyone still facing this issue.

  1. [weak self] is not possible because Struct is value type and not a Reference type, so no pointer as such.

  2. The main issue of leak here is you are trying to access the Struct property self.someState = something inside the completion block which will basically create a new copy of your structure on assignment.

You should not access Struct Property inside completion block.


You can solve the problem by creating a weak reference to the object which is captured by the closure.

Here is your example without memory leak:

import Foundationimport RxSwiftstruct WithoutLeak {    var someState: String = "initial value"    var someVariable: Variable<String> = Variable("some stuff")    let bag = DisposeBag()    mutating func someFoo() {        weak let weakSomeState = someState // <-- create a weak reference outside the closure        someVariable.subscribeNext { person in            weakSomeState = "something" // <-- use it in the closure        }        .addDisposableTo(bag)    }}