핵심 요약
- `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
}
}delegate는 왜 보통 weak인가요?
보통 소유자는 화면/매니저 쪽이고 delegate는 역방향 참조다. 여기에 strong을 쓰면 서로 생명주기를 잡아당겨 순환 참조가 쉽게 생긴다.
unowned가 weak보다 더 좋은가요?
더 좋은 게 아니라 전제가 더 강한 선택이다. 대상이 반드시 살아있다는 확신이 없으면 `weak`가 안전하다.