iOS Development Guide

retain cycle이 생기는 대표 사례

retain cycle은 ARC가 못 푸는 구조 문제다. strong reference가 원형으로 연결되면 참조 수가 0이 되지 않아 객체가 영원히 해제되지 않는다.

ARC fundamentals Graph-based reasoning Knowledge item #13
학습 날짜

기록 없음

대표 패턴 1: Parent ↔ Child 상호 strong

final class Parent {
    var child: Child?
}

final class Child {
    var parent: Parent? // strong이면 순환 가능
}

역참조는 보통 소유 관계가 아니므로 `weak`로 끊는다.

대표 패턴 2: 클로저가 self 강한 캡처

final class VM {
    var onDone: (() -> Void)?

    func bind() {
        onDone = {
            self.finish() // self 강한 캡처
        }
    }

    func finish() {}
}

`self`가 `onDone`을 소유하고, 클로저가 다시 `self`를 잡아 순환이 된다.

대표 패턴 3: Timer / CADisplayLink

  • 타이머가 타깃 객체를 강하게 잡고
  • 타깃이 타이머를 프로퍼티로 갖는 경우
  • 해제되지 않고 주기 호출이 계속된다.

대표 패턴 4: Notification/Observer 정리 누락

  • observer 토큰을 strong으로 들고 있고
  • deinit에서 해지하지 않으면
  • 생명주기 끝난 줄 알았던 객체가 남을 수 있다.

끊는 기준