Cycle Guard

순환 참조 차단 기준

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을 처리합니다.