Swift의 ARC는 런타임에서 인스턴스에 대한 강한 참조(strong reference)를 추적하여, 참조 카운트(reference count)가 0이 되면 메모리를 해제하는 자동 메모리 관리 기법입니다.
인스턴스를 생성하면 참조 카운트가 1로 시작하고, 인스턴스를 가리키는 변수나 상수가 strong으로 선언될 때마다 카운트가 +1, 해제될 때마다 –1이 됩니다.
예시:
class Person {
let name: String
init(name: String) { self.name = name }
deinit { print("\(name) deinitialized") }
}
var a: Person? = Person(name: "Alice") // 카운트 1
var b = a // strong 복사 → 카운트 2
a = nil // 카운트 1
b = nil // 카운트 0 → deinit 호출, 메모리 해제
class Parent {
var child: Child?
}
class Child {
weak var parent: Parent?
}class Customer {
let card: CreditCard
init() { card = CreditCard(owner: self) }
}
class CreditCard {
unowned let owner: Customer
init(owner: Customer) { self.owner = owner }
}[weak self] 또는 [unowned self]를 명시 class ViewController {
lazy var handler: () -> Void = { [weak self] in
guard let self = self else { return }
self.doSomething()
}
}deinit이 한 번 호출됩니다. deinit 내부에서는 리소스 해제, 옵저버 제거, Notification 해제, 파일 닫기 등 메모리 외의 클린업 작업을 처리할 수 있습니다. class FileHandler {
let handle: FileHandle
init(path: String) { handle = FileHandle(forReadingAtPath: path)! }
deinit {
handle.closeFile()
print("파일 핸들러 해제")
}
}배운 점
weak와 unowned의 차이를 명확히 구분하여 적절히 사용해야 한다. deinit은 단순히 메모리 해제뿐 아니라, 외부 리소스 해제에도 중요한 역할을 한다.