본문 바로가기

iOS 개발/번역기 앱(RxSwift)

번역기 앱 - 13. RxSwift의 메모리 누수 체크

반응형

안녕하세요. Skillist입니다

 

성능 체크가 생각난 김에, RxSwift 프로젝트로 진행해보려고 했습니다.

하지만, RxSwift의 메모리 릭 확인 방법이 기존과 같나요???

 

잘 모르겠어서 검색해봤습니다.

 

———————————————————————————————————————————————————

 

우선 좋은 영상을 공유드립니다.

https://www.youtube.com/watch?v=687KaKJ8B7U&t=309s 

곰튀김님의 영상인데, RxSwift의 메모리 누수에 대해서 아주 잘 설명해주시네요.

곰튀김님의 RxSwift 영상은 정말 최고입니다.

RxSwift 공부중이라면 풀영상(약 4시간 정도)을 추천합니다.

이미 봤지만, 심심할때 한번 더 봐야겠네요.

 

댓글에도 답변 주셨는데요, 한번 봐보세요.

subscribe의 클로져에서 self를 사용한 경우 레퍼런스 카운트가 증가하고,

스트림이 종료되어 클로저가 없어질 경우 레퍼런스 카운트가 감소합니다.

 

항상 유의해야겠지만, 특히 종료되지 않는 스트림에 대해서 메모리 릭을 유의해야겠네요.

 

———————————————————————————————————————————————————

 

https://github.com/ReactiveX/RxSwift/blob/c6c0c540109678b96639c25e9c0ebe4a6d7a69a9/Documentation/GettingStarted.md#enabling-debug-mode

 

GitHub - ReactiveX/RxSwift: Reactive Programming in Swift

Reactive Programming in Swift. Contribute to ReactiveX/RxSwift development by creating an account on GitHub.

github.com

공식 문서 내용을 보면, 다음과 메모리 누수 내용이 작성돼있어요.

 

디버그 모드에서 Rx는 전역 변수에 할당된 모든 리소스를 추적합니다 Resources.total.
리소스 누수 감지 로직이 필요한 경우 가장 간단한 방법은 RxSwift.Resources.total주기적으로 출력하여 출력하는 것입니다.

메모리 누수를 테스트하는 가장 효율적인 방법은 다음과 같습니다.

  • 화면으로 이동하여 사용
  • 뒤로 탐색
  • 초기 자원 수 관찰
  • 두 번째로 화면으로 이동하여 사용
  • 뒤로 탐색
  • 최종 리소스 수 관찰
초기 리소스 수와 최종 리소스 수의 리소스 수에 차이가 있는 경우 어딘가에 메모리 누수가 있을 수 있습니다.
/*
     func application(_ application: UIApplication, didFinishLaunchingWithOptions launchOptions: [UIApplicationLaunchOptionsKey : Any]? = nil) 
* / _ = Observable < Int > . 간격 (. 초 ( 1 ), 스케줄러 : MainScheduler. instance )    
     
        . subscribe ( onNext : { _  in 
            print ( " Resource count \( RxSwift. Resources . total ) " )
        })

안내 해준 코드를 통해,

최초의 리소스 개수를 확인하고

기능 동작 후의 최종 리소스 개수를 확인하라는 말입니다.

 

저도 코드를 추가해보니, 다음과 같은 에러가 발생하더라구요

"Module 'RxSwift' has no member named 'Resources'"

 

열심히 구글링 해보니 다음 해결 페이지를 발견할 수 있었습니다.

https://github.com/ReactiveX/RxSwift/issues/378

 

RxSwift.resourceCount not accessable · Issue #378 · ReactiveX/RxSwift

if TRACE_RESOURCES private let startResourceCount = RxSwift.resourceCount endif Says, Module 'RxSwift' has no member named 'resourceCount'

github.com

Podfile에 다음 내용을 추가하라고 하네요.

  post_install do |installer|
        installer.pods_project.targets.each do |target|
            if target.name == 'RxSwift'
                target.build_configurations.each do |config|
                    if config.name == 'Debug'
                        config.build_settings['OTHER_SWIFT_FLAGS'] ||= ['-D', 'TRACE_RESOURCES']
                    end
                end
            end
        end
    end

네~ 추가한 후에 pod update를 수행했더니 바로 해결되네요!!!!!

 

그리고 앱을 실행해 보니,

625개가 기본 개수였습니다.

기능을 수행해보니 632로 종종 올라갔다가 최종적으로 625개로 되돌아왔습니다.

 

이정도면, 깔끔한 편인것 같죠?????

 

———————————————————————————————————————————————————

 

이외에도 다른 방법들이 있는것으로 알고있는데, 공부하여 추후 내용을 업데이트 하겠습니다.

 

먼저 코드 레벨에서 스트림이나 클로저에서의 self 사용을 다시 확인해봐야겠어요.

 

잘못되거나 부족한 내용 등, 피드백 감사합니다!

 

https://github.com/DeveloperSkillist/TranstorKing

 

GitHub - DeveloperSkillist/TranstorKing

Contribute to DeveloperSkillist/TranstorKing development by creating an account on GitHub.

github.com

반응형