일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | ||||
4 | 5 | 6 | 7 | 8 | 9 | 10 |
11 | 12 | 13 | 14 | 15 | 16 | 17 |
18 | 19 | 20 | 21 | 22 | 23 | 24 |
25 | 26 | 27 | 28 | 29 | 30 | 31 |
- dispatchqueue
- observable
- cellForRowAt
- restfulAPI
- SwiftUI
- UIKit
- 개발블로그
- 라이징캠프
- Main Thread
- interceptor
- 컴공선배
- QoS
- Moya
- RequestInterceptor
- RxSwift
- ContentMode
- alamofire
- distinctUntilChanged
- flatmap
- Xcode
- iOS교육
- UIListContentConfiguration
- SWIFT
- IOS
- defaultContentConfiguration
- UICollectionViewListCell
- ReactiveX
- observe(on:)
- RxCocoa
- URLSession
- Today
- Total
RB의 iOS 개발 이야기
Xcode에서 메모리 누수를 확인하는 방법(?)! 본문
안녕하세요.
오늘은 오랜만에 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 |
---|