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