RB의 iOS 개발 이야기

Xcode에서 메모리 누수를 확인하는 방법(?)! 본문

iOS/Xcode

Xcode에서 메모리 누수를 확인하는 방법(?)!

RaeBaek 2024. 1. 31. 09:44

안녕하세요.

오늘은 오랜만에 RxSwift를 다시 공부해볼 겸 곰튀김 님의 강의 영상을 시청하던 중 전혀 모르고 있던 꿀팁을 알게되어 공유드릴 겸 글을 작성하게 되었습니다!

 

바로 확인해보시죠!

 

먼저 간단하게 어떻게 메모리 누수를 일으키는지 코드를 살펴 보겠습니다.

private func downloadJson(_ url: String) -> Observable<String?> {
        return Observable.create() { f in
            DispatchQueue.global().async {
                let url = URL(string: url)!
                let data = try! Data(contentsOf: url)
                let json = String(data: data, encoding: .utf8)
                
                DispatchQueue.main.async {
                    f.onNext(json)
//                    f.onCompleted()
                }
            }
            return Disposables.create()
        }
    }

 

f라는 observer에 .onNext로 json 이벤트를 넣어주고 있습니다.

 

        let disposable = downloadJson(MEMBER_LIST_URL)
            .subscribe { event in
                switch event {
                case .next(let json):
                    self.editView.text = json
                    self.setVisibleWithAnimation(self.activityIndicator, false)
                case .error(_):
                    break
                case .completed:
                    break
                }
            }
//            .disposed(by: disposeBag)

 

.subscribe 구문 내의 클로저가 switch 구문 내의 editView와 setVisibleWithAnimation 메서드를 캡쳐하게 되면서 순환 참조의 문제가 발생하게 됩니다. 이 부분은 다들 잘 아실거라고 생각합니다!

 

상대적으로 간단하고 알아보기 쉬운 코드라면 순환 참조에 대해서 하나 하나 체크가 가능할 수 있습니다.

하지만 프로젝트 규모가 커지고 파일 수가 방대해진다면 하나 하나 찾는 것은 불가능하겠죠...

 

그래서 저는 메모리 누수가 일어났을 때를 시각적으로 알아볼 수 있다면 정말 좋겠다는 생각을 항상 가지고 있었는데요. 이번에 곰튀김님 영상을 보며 다시 공부하던 중! 현강생 분께서 알려주신 방법을 터득하게 되었습니다!

 

방법은 아래에 순서대로 적어보겠습니다. 먼저

 

1. Xcode에서 Edit Scheme... 를 클릭합니다.

 

2. Run -> Diagnostics -> Memory Management 에서 Malloc Scribble과 Malloc Stack Logging 을 체크해줍니다!

 

3. 다음과 같이!

 

그리고 빌드 후 Debug Memory Graph를 클릭하면?

 

어떤걸 봐야할지 잘 모르겠죠 ㅎㅎ.. 저희는 가장 하단에!

 

마치 '누수'를 표현하고 있는 것 같은 '물방울' 아이콘을 클릭해줍니다! 

 

그러면? 아래와 같이 항목이 줄어(?)듭니다!

사실 저도 이것만 봐서는 무엇이 무엇을 참조하며 누수를 일으키는 지는 정확히는 못 알아보겠습니다!

 

하지만 위 코드를 수정하여 f.onCompleted()를 추가하고 실행해주면!

 

다음과 같이 누수가 일어나지 않는 경우에는 표시가 되지 않음을 확인할 수 있습니다!

 

현재 프로젝트는 상당히 가벼운 프로젝트라 규모가 커졌을 때에도 이 같은 방법이 모든 누수를 다 캐치할 수 있을지는 모르겠으나!

 

확인 용도로는 도움이 될 것 같아 글을 작성해봤습니다!

 

감사합니다!

 


참고

https://www.youtube.com/watch?v=iHKBNYMWd5I&list=PL03rJBlpwTaBrhux_C8RmtWDI_kZSLvdQ

https://github.com/iamchiwon/RxSwift_In_4_Hours?tab=readme-ov-file

 

GitHub - iamchiwon/RxSwift_In_4_Hours: RxSwift, 4시간 안에 빠르게 익혀 실무에 사용하기

RxSwift, 4시간 안에 빠르게 익혀 실무에 사용하기. Contribute to iamchiwon/RxSwift_In_4_Hours development by creating an account on GitHub.

github.com

 

'iOS > Xcode' 카테고리의 다른 글

Xcode의 영역들과 Interface Builder에 대해서 알아보자.  (0) 2023.08.27