Manan Patel

Tinkering and Sharing

🧠 iOS Memory Management

Understanding ARC, weak references, and memory management in iOS

schedule 8 min read calendar_today 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