Memory Leak

2023. 10. 31. 22:10iOS/이슈

Coorinator 패턴을 적용 후, Memory Leak이 있는지 없는지 체크해 보았다.

 

시나리오는

MainCoordinator(TabBar)가 제거 후, Login flow를 탈 때

TabBar가 가지고 있던 VC들에 대해 체크

 

1. 첫번째 탭의 첫번쨰 VC에서 RX.debug() 해 놓을 것들이 dispose메세지가 뜨지 않았다.

해서 deinit 안에 로그를 찍어보았는데, deinit 로그가 찍히지 않음.

 

2. instrument에서 Leak을 이용하여 체크 시도

Leak이 없다고 나온다!!? 하지만 Dispose도 되지 않고, deinit 로그도 찍히지 않았음

 

3. Rx 때문에 Leak이 나는지 child Coordinator 해제 시 Leak이 나는지 체크

기존 Leak이 나던 첫번째 VC 앞에 임시 VC를 끼워넣고 child Coordinator해제 시도
임시 VC는 deinit된걸 확인함.

그러면 Rx때문에 Leak이 났다는 걸 확인했음.

4. Alert창을 띄우는 trigger에서 Leak 발생 확인

트리거마다 체크해보다가 아래의 트리거에서 문제가 발생한 것을 확인하고 수정하였다. 가장 상위에서 weak capture해줘야 했는데 Observable.create 클로저에서 capture해서 문제가 발생

 

 let logOutTrigger =
    item.rx.tap
// --      .flatMapLatest { _ in
		.flatmapLatest { [weak self] _ in
        // -- Observable<Void>.create { [weak self] observer in
         Observable<Void>.create { observer in
          let alertController = UIAlertController(title: nil, message: "로그아웃하시겠습니까?", preferredStyle: .alert)
          let action = UIAlertAction(title: "로그아웃", style: .destructive) { _ in
            observer.onNext(Void())
          }
          let cancel = UIAlertAction(title: "취소", style: .cancel)
          alertController.addAction(action)
          alertController.addAction(cancel)
          self?.present(alertController, animated: true)

          return Disposables.create {
            observer.onCompleted()
          }
        }
      }
      .asDriverOnErrorJustComplete()