Disposable.
RxSwift에서 Disposable을 보면서 이것 참 C 스럽다는 생각이 많이 든다.
C언어를 해본사람들은 알겠지만 C에서 가장 귀찮은게 뭐냐고 물어본다면 포인터와 메모리 관리다.
이 배열의 첫 아이템이 배열의 주소니까 그걸 따라가서 복사한다음에 어쩌구 저쩌구...
그리고 그걸 자연스럽게 해제해주지 않으면 프로그램이 shut down!
사실 RxSwift에서도 동일한 작업이 이뤄진다.
이 시퀀스(Observable)이 저쪽에서 구독(subscribe)되고 또 그게 다른 변수로 복사된다음 합쳐지고 다시 이건 해제(Disposable)되는데 다른건 아직 안되서 결국은 메모리 누수가 발생한다.
제대로 해제해주지 않아 발생하는 에러... RxSwift가 발전하면 언젠가는 이게 편하게 쓸수 있는 날이 올거라 믿는다.
아무튼, 이러한 이유로 어떻게 메모리 해제를 해야하는가에 대해 정리하고자 한다.
원래는 DisposeBag에 전부 넣어서 관리를 하려 했으나... 메인스케쥴러가 아닌 곳에서 시퀀스가 생성되고 돌아가다보니 뷰 컨트롤러가 Dismiss되어도 메모리에 찌꺼기처럼 계속 남는다.
ARC에서도 상호참조가 문제였는데 여기는 그 문제가 더욱 깊어진다.
좋다고 덮어놓고 쓰다보면 밤샘지옥이 기다리고 있을 것이다.
일단 RsSwift에서 사용하는 Disposable의 종류를 알파벳순으로 정리해보면 다음과 같다.
AnonymousDisposable
- action base의 Disposable
- Dispose 된 이후 실행시킬 Action을 지정할 수 있다.
BinaryDisposable
- 동시에 Dispose될 2개의 Disposable을 지정한다.
BooleanDisposable
- dispose되었는지에 대한 스테이터스를 확일 할 수 있는 Disposable
CompositeDisposable
- 여러개의 disposable을 하나로 묶을 수 있는 Disposable
NopDisposable
- Nop: No operation
- Dispose를 해도 Dispose하지 않고 아무것도 하지 않는다.
RefCountDisposable
- ARC(Auto Reference Counting)를 해주는 Disposable
ScheduledDisposable
- 지정한 스케쥴러에 의해 Dispose처리를 함
SerialDisposable
- 새로운 Disposable을 넣으면 기존에 있던 Disposable이 Dispose됨. -> 병렬처리
SingleAssignmentDisposable
- 1개만을 집어 넣을 수 있는 Disposable
- 2번째를 넣으면 Exception을 발생시킨다
DisposeBag
- 자기 자신이 메모리에서 해제될때 같이 Dispose되는 Disposable
** Disposable은 프로토콜 타입이다. 따라서 Disposable만을 생성하는 것은 불가능하다.
댓글 없음:
댓글 쓰기