iOS Development Guide

strong, weak, unowned 차이

셋의 차이는 문법이 아니라 "소유권"과 "해제 이후 안전성"이다. 객체 생명주기를 누가 책임지는지 먼저 정하고, 그다음 strong/weak/unowned를 선택해야 한다.

Ownership semantics Lifecycle-driven choice Knowledge item #12
학습 날짜

기록 없음

핵심 요약

  • `strong`: 참조 수를 올리고, 생명주기를 소유한다.
  • `weak`: 참조 수를 올리지 않으며, 대상 해제 시 자동으로 `nil`이 된다.
  • `unowned`: 참조 수를 올리지 않지만 `nil`이 될 수 없다고 가정한다.

선택 기준

  • 소유해야 하는 관계면 `strong`.
  • 소유하지 않고 대상이 먼저 사라질 수 있으면 `weak`.
  • 대상이 반드시 더 오래 살아야 하는 관계면 `unowned`.

실전 예시

final class Parent {
    var child: Child? // Parent가 Child를 소유
}

final class Child {
    weak var parent: Parent? // 역참조는 소유하지 않음
}

final class Owner {
    let profile: Profile

    init(profile: Profile) {
        self.profile = profile
    }
}

final class Profile {
    unowned let owner: Owner // owner가 항상 더 오래 산다는 전제

    init(owner: Owner) {
        self.owner = owner
    }
}
`unowned`는 전제가 깨지면 크래시가 나므로, 수명 관계를 100% 확신할 수 있을 때만 사용한다.

`weak`를 쓰는 대표 상황

  • delegate 패턴
  • 상위/하위 객체 간 역방향 참조
  • 클로저 캡처에서 `self`가 먼저 해제될 수 있는 경우

`unowned`를 쓰는 대표 상황

  • 서로 강하게 연결되지만, 한쪽 수명이 항상 더 길다고 보장되는 모델
  • 옵셔널(`nil`) 상태 자체가 불필요한 경우
  • 성능 미세 최적화보다 모델 불변식이 더 중요한 경우

실수하기 쉬운 패턴

Then 1

delegate는 왜 보통 weak인가요?

보통 소유자는 화면/매니저 쪽이고 delegate는 역방향 참조다. 여기에 strong을 쓰면 서로 생명주기를 잡아당겨 순환 참조가 쉽게 생긴다.

Then 2

unowned가 weak보다 더 좋은가요?

더 좋은 게 아니라 전제가 더 강한 선택이다. 대상이 반드시 살아있다는 확신이 없으면 `weak`가 안전하다.