SettingRoutineViewModel의 단식 타이머 설정 삭제 버튼을 눌렀을 때 present되는 alert의 확인, 취소 action의 event를 처리하는 코드 작성 후 SettingRoutineViewModel이 deinit 되지 않는 문제가 발생해 memory graph를 확인하니 순환 참조 문제가 발생하고 있었습니다.
deleteAlertActionRelay의 onNext 시 실행되는 클로저는 내부에 클로저가 하나 더 있는 nesting closure 형태입니다. 내부에 있는 closure가 [weak self]로 캡처리스트를 정의해 약한 참조로 self를 캡처하는 것처럼 보입니다. 하지만 내부 closuer가 캡처하는 self는 외부 closure scope에서의 self이고 외부 클로저에서는 약한 참조로 self를 캡처하지 않아 강한 참조로 self를 참조해 메모리 누수가 발생했습니다.
외부 클로저에서 [weak self]를 사용해 클로저 캡처리스트를 정의해줘 self를 약한 참조로 참조하게해 순환 참조 때문에 SettingRoutineViewModel이 deinit되지 않는 문제를 해결했습니다.
문제 원인을 파악하면서 RxSwfit 공식 문서에서 봤던 nesting subscribe가 원인 인지 의심하기도 했습니다.
문제의 직접적인 원인은 아니었지만 code smell이므로 flatMap 연산자를 사용해 코드를 수정했습니다.