Memory Leak이란?
'메모리 누수'라고도 표현하며, 더이상 사용되지 않는 인스턴스가 메모리에서 해제되지 않고 남아있는 현상을 뜻한다.
이 메모리 누수를 해결하지 않으면 한정된 리소스를 효과적으로 활용하기 어려우니 메모리 누수가 일어나고 있지는 않은지 확인해서 반드시 해결해야 한다.
이번 글에서는 Memory Leak을 확인하는 두가지 방법을 소개하고자 한다.
바로 Xcode의 'Memory Graph Debugger'와 'Instruments'다.
그중에서도 이번에는 Memory Graph Debugger에 대해 알아보자.
사전 준비
두가지 방법을 테스트하기 위한 것이므로 아주 간단하게 준비했다.
첫번째 흰 화면(First)에서 화면을 터치하면 바로 두번째 파란 화면(Second)로 넘어간다.
첫번째 화면에서는 화면 전환 말고 아무것도 일어나지 않는다.
중요한 건 두번째 화면이다.
import UIKit
// 첫번째 화면 코드
class ViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
}
override func touchesBegan(_ touches: Set<UITouch>, with event: UIEvent?) {
guard let second = self.navigationController?.storyboard?.instantiateViewController(withIdentifier: "secondViewController") as? SecondViewController else {
return
}
self.navigationController?.pushViewController(second, animated: true)
}
}
두번째 화면에서는 sampleA, sampleB라는 인스턴스를 두 개 생성한다.
(딱히 중요한 부분은 아니라 클래스도 아주 간단하게 아래처럼 정의했다.)
class SampleA {
var target: SampleB?
}
class SampleB {
var target: SampleA?
}
그리고 서로가 서로의 target프로퍼티에 할당되어 서로를 강하게 참조한다.
import UIKit
class SecondViewController: UIViewController {
override func viewDidLoad() {
super.viewDidLoad()
let sampleA = SampleA()
let sampleB = SampleB()
sampleA.target = sampleB
sampleB.target = sampleA
}
}
정상적인 상황이라면 만약 유저가 second화면에 진입했다가 다시 이전 화면으로 돌아간다면 더이상 사용되지 않는 두 인스턴스 sampleA, sampleB는 메모리에서 해제가 되어야 한다.
그러나 지금처럼 서로를 강하게 참조하는 상황에서는 각 인스턴스가 해제되어도 서로를 참조해서 참조 카운트가 0이 아니라 여전히 1로 유지가 되어 메모리에서 해제되지 않을 것이다.
→ 이것이 바로 Memory Leak이다.
과연 실제로 Memory Leak이 발생하고 있는지 확인해 보자.
방법1: Memory Graph Debugger
코드를 실행한다. 앱이 running상태에 진입하면 메모리를 확인하고 싶은 화면까지 이동한다.
노란색 상자가 쳐진 곳을 보면 작은 원 세 개가 이어진 아이콘이 있는데, 이 아이콘이 바로 Debug Memory Graph를 볼 수 있는 아이콘이다.
이 아이콘을 클릭하면 현재 상태의 메모리 snapshot이 찍히면서, 좌측 네비게이터 탭에서 현재 어플의 메모리 상태를 확인할 수 있다.
빨간 상자가 쳐진 곳을 보면 위 코드에서 설정한 대로 SampleA, SampleB 인스턴스가 서로를 강하게 참조하고 있어서 Memory Leak이 발생했다고 보라색 아이콘으로 경고를 알려준다.
Memory Leak이 일어나는 부분만 보고싶다면 맨 아래 파란색으로 표시된 삼각형 버튼을 누르면 아래 그림처럼 필터링을 해준다.
리스트의 인스턴스를 클릭하면 Memory Leak 뿐만 아니라 해당 객체가 메모리에 할당될 수 있도록 Reference Count를 유지시켜주는 chain of references를 확인할 수 있다.
맨 오른쪽에 있는 객체가 리스트에서 내가 선택한 객체고, 나머지 객체들은 이 객체가 메모리에서 유지되도록 객체를 참조하는 또 다른 객체들이다.
- 굵은 화살표(그림에서 흰색): Strong reference
- 얇은 화살표(그림에서 회색): Unknown reference(weak일 수도 strong일 수도 있음)
'iOS' 카테고리의 다른 글
[iOS] Xcode에서 Memory Leak을 확인하는 두 가지 방법 - 2) Instruments (1) | 2022.03.11 |
---|---|
[iOS] 앱을 첫 출시 했는데, 언어가 영어(EN)라고? 대체 왜?? (0) | 2022.01.03 |
[iOS] 텍스트 필트(UITextField) 커서 숨기기 (0) | 2021.12.25 |
[iOS] Scroll View의 오토 레이아웃이 동작하지 않을 때 in storyboard (0) | 2021.08.12 |