Observable은 기본적으로, complete이나 error가 발생하기 전까진 계속 이벤트를 방출 시킨다.
따라서, 이벤트가 더이상 방출되면 안 되는 시점에서 리소스를 직접 deinit 해줘야 한다.
만약 deinit 해주는 과정을 하지 않으면, 리소스는 계속해서 필요할 때마다 이벤트를 방출시키는 메모리 leak으로 이어진다.
여기서 deinit은 dispose를 이용한다.
근데, 앞으로 보통은 DisposeBag을 이용해서 deinit을 해줄 예정이다. DisposeBag은 dispose를 여러개 담는 메소드이다. 자신이 deinit될 때 갖고 있던 disposable을 모두 dispose 시키기 때문에 따로 deinit 구문을 적어주지 않아도 된다.
참고로 ControlEvent의 경우, 해당 이벤트를 갖고 있는 인스턴스가 deinit 될 때 자동으로 dispose 된다. 예를 들어 다음과 같은 케이스에서는 disposable에 대해 따로 처리해주지 않아도 된다.
import UIKit
import RxSwift
import RxCocoa
class SodeulViewController: UIViewController {
@IBOutlet weak var sodeulButton: UIButton!
override func viewDidLoad() {
super.viewDidLoad()
sodeulButton.rx.tap
.subscribe(onNext: {
print("소들 버튼 눌림")
}, onDisposed: {
print("소들 버튼 disposed")
})
}
}
그렇지만 명시적으로 disposeBag 처리를 해주는 게 좋다고 들었다.
헷갈릴 수 있는 부분은, dispose는 해당 Observable에 대한 구독을 해제하고, 관련된 리소스를 정리하는 작업이기 때문에 이미 바인딩 혹은 구독된 속성을 초기화하지 않는다.
참고:
SeSAC 메모리스
https://babbab2.tistory.com