🧠 iOS Memory Management
Understanding ARC, weak references, and memory management in iOS
8 min read
February 14, 2024
Understanding ARC
ARC automatically manages memory by counting references to objects. When the reference count reaches zero, the object is deallocated.
Strong vs Weak References
// Strong reference (default) - creates retain cycle
class Person {
let name: String
var friend: Person? // Strong reference
init(name: String) {
self.name = name
}
}
// Weak reference - breaks retain cycle
class Person {
let name: String
weak var friend: Person? // Weak reference
init(name: String) {
self.name = name
}
}
Common Memory Leak Scenarios
Closures
// ❌ Creates retain cycle
class NetworkManager {
var onComplete: (() -> Void)?
func fetchData() {
onComplete = {
self.processData() // Strong reference to self
}
}
}
// ✅ Use weak self
class NetworkManager {
var onComplete: (() -> Void)?
func fetchData() {
onComplete = { [weak self] in
self?.processData() // Weak reference to self
}
}
}
Delegates
protocol ViewControllerDelegate: AnyObject {
func didFinish()
}
class ViewController: UIViewController {
weak var delegate: ViewControllerDelegate? // Always weak for delegates
}
Best Practices
✅ Do's
- Use weak references for delegates
- Use weak self in closures
- Use @StateObject for view models in SwiftUI
- Clean up resources in deinit
❌ Don'ts
- Don't create retain cycles
- Don't use strong references for delegates
- Don't ignore memory warnings