왜 ARC가 못 푸는가
- ARC는 참조 수를 계산할 뿐 "관계의 의도"를 모른다.
- 서로 strong이면 참조 수가 0이 안 된다.
- 결국 설계에서 소유권 방향을 끊어줘야 한다.
핵심은 "누가 클로저를 소유하는가"다. 객체가 클로저를 프로퍼티로 strong 소유하고, 그 클로저가 다시 self를 strong 캡처하면 순환 참조가 생긴다.
기록 없음
final class LoginViewModel {
var onSuccess: (() -> Void)?
func bind() {
onSuccess = {
self.routeToHome() // self strong capture
}
}
func routeToHome() {}
}onSuccess = { [weak self] in
guard let self else { return }
self.routeToHome()
}수명 보장이 강하면 `[unowned self]`도 가능하지만, 전제가 깨지면 크래시 위험이 있다.