Reference Cycles in Swift

From the Swift cheat sheet · Memory Management · verified Jul 2026

Reference Cycles

Breaking retain cycles with weak and unowned

swift
// Weak vs Unowned
class Parent {
    let name: String
    var child: Child?

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) parent deallocated")
    }
}

class Child {
    let name: String
    weak var parent: Parent?  // Weak to break cycle

    init(name: String) {
        self.name = name
    }

    deinit {
        print("\(name) child deallocated")
    }
}

// Unowned for non-optional references
class CreditCard {
    let number: String
    unowned let owner: Customer  // Always has owner

    init(number: String, owner: Customer) {
        self.number = number
        self.owner = owner
    }
}
💡 Use weak for optional references that might become nil
⚡ Use unowned when reference will never be nil during use
📌 Always use capture lists in closures to prevent retain cycles
🟢 Check for memory leaks with Instruments
Back to the full Swift cheat sheet