순환 참조 차단 기준
Rc끼리 서로 강하게 가리키면 카운트가 0이 되지 않아 메모리가 해제되지 않으므로 소유 관계와 관찰 관계를 분리해야 합니다.
소유는 Rc, 관찰은 Weak
값을 살리는 방향만 strong_count에 남깁니다.
Before: Rc 순환
leak risk
Node A
Rc<B>
strong
strong
Node B
Rc<A>
drop 이후
서로가 서로를 살려 strong_count가 0으로 내려가지 않습니다.
After: Weak 역참조
break cycle
Owner
Rc<Child>
strong down
weak back
Child
Weak<Owner>
drop 이후
Weak는 소유하지 않으므로 strong_count가 0이 되면 값이 해제됩니다.
1. 소유 방향
값의 생명주기를 책임지는 간선만 Rc로 둡니다.
2. 관찰 방향
부모, 캐시, 역참조는 Weak로 낮춥니다.
3. upgrade
대상이 사라진 경우 None을 처리합니다.