오류해결: RxSwift Closure Circular Reference

Minseok, Kim·2021년 12월 27일
0

요약

[weak self]를 활용하여 closure에서의 순환참조를 꼭 해결하자...

발생한 오류

RxSwift를 활용한 채팅 앱을 만들고 있었다. 친구목록을 보여주는 FriendListView에서 친구를 선택하면 UINavigationController를 통해서 친구와의 채팅화면을 보여주는 ChatRoomView로 이동을 하게 된다.(FriendListViewChatRoomView는 각각의 ViewModel로 Bind되어있다.) 이후 ChatRoomView를 Pop하여 FriendListView로 되돌아 왔는데, Xcode의 Debug Navigator의 메모리 사용량이 그대로이다... 뭔가 이상함을 느껴서 위의 동작을 여러번 수행해봤는데, 아니나 다를까 ChatRoomView의 메모리 해제가 수행되지 않고 있었다...

해결 과정

처음에는 RxSwift의 DisposeBag에서 Dispose가 일어나지 않는 것이 원인이라 생각했다. DisposeBag의 Dispose를 수행하는 위치에 Log들을 찍어보았지만, 우리의 DisposeBag는 정상적으로 동작하고 있었다.

원인을 찾아야 해결할 수 있다는 생각에 memory leak를 해결하는 방법을 찾다가 Xcode에서 지원하는 여러가지 기능들을 알게 되었다. Debug Memory Graph와 Instruments Profiling의 Leaks가 그것인데, 이와 관련해서는 좀 더 사용을 해보고 나중에 글을 작성해보는 것도 좋겠다.

아무튼, Memory Leak를 통해 점점 쌓여가는 ChatRoomViewChatRoomViewModel을 확인해보니 모두 RxSwift Closure의 Strong Reference로 인한 문제였다. 이 부분에서 아차 싶었다. 당연히도 Closure에서의 Circular Reference를 고려했어야 했는데, 전혀 생각지 못한 상태로 앱을 만들고 있었다... 역시 아직 갈길이 멀구나...

해결 방법

RxSwift의 Closure들이 Self를 Strong하게 물고 있다는 원인이 파악되었으니, 해결하는 방법은 간단했다. [weak self]를 사용하여 weak reference를 적용시켜주면 된다. 너무나 쉽다... 세상에...

추가 자료

https://velog.io/@haanwave/Article-You-dont-always-need-weak-self

profile
iOS, Swift Dev

0개의 댓글