iOS Development Guide

deinit이 언제 호출되는지

`deinit`은 class 인스턴스의 strong reference count가 0이 되는 시점, 즉 메모리 해제 직전에 호출된다. ARC에서 객체가 내려가는 마지막 훅이다.

ARC lifecycle Reference count driven Knowledge item #15
학습 날짜

기록 없음

핵심 정리

  • `deinit`은 `class`에서만 존재한다.
  • strong reference가 0이 될 때 호출된다.
  • `deinit` 종료 후 실제 메모리 해제가 진행된다.

struct에는 왜 없나

`struct`/`enum`은 값 타입이라 ARC 대상이 아니다. 그래서 `deinit` 같은 소멸자 훅이 없고, 값 생명주기는 스코프와 복사 semantics로 관리된다.

호출 타이밍 예시

final class Worker {
    deinit {
        print("Worker deinit")
    }
}

func run() {
    var worker: Worker? = Worker()
    worker = nil // strong reference 0 -> deinit 호출
}
지역 스코프 종료, 프로퍼티 nil 대입, 컬렉션에서 제거 등으로 strong 참조가 모두 사라지면 `deinit`이 호출된다.

호출이 안 되는 경우

  • retain cycle로 strong reference가 서로 물려 있는 경우
  • 전역/싱글톤/캐시에 strong으로 계속 보관되는 경우
  • escaping 클로저가 self를 강하게 잡고 있는 경우

실무 체크리스트

  • 해제 예상 객체에 `deinit` 로그를 넣고 확인
  • 뷰/뷰모델/코디네이터 종료 시점에 로그가 찍히는지 점검
  • 안 찍히면 메모리 그래프로 참조 경로 추적