Search code examples
swiftautomatic-ref-countingvalue-typereference-countingreference-type

Reference cycles with value types?


Reference cycles in Swift occur when properties of reference types have strong ownership of each other (or with closures).

Is there, however, a possibility of having reference cycles with value types only?


I tried this in playground without succes (Error: Recursive value type 'A' is not allowed).

struct A {
  var otherA: A? = nil
  init() {
    otherA = A()
  }
}

Solution

  • A reference cycle (or retain cycle) is so named because it indicates a cycle in the object graph:

    retain cycle

    Each arrow indicates one object retaining another (a strong reference). Unless the cycle is broken, the memory for these objects will never be freed.

    When capturing and storing value types (structs and enums), there is no such thing as a reference. Values are copied, rather than referenced, although values can hold references to objects.

    In other words, values can have outgoing arrows in the object graph, but no incoming arrows. That means they can't participate in a cycle.