[iOS] 메모리 누수 (Memory Leak) 💩

Cho·2023년 11월 30일
post-thumbnail

안녕하세요!
오늘은 메모리 릭에 관해 이야기 해볼까 합니다.

메모리 누수??

먼저 메모리 누수가 뭘까요??
느낌으로만 봤을때 메모리가 낭비(?)되는 현상이라고 생각되는데요

프로그램에서 사용한 메모리를 해제하지 않고 계속 사용하는 상황
두 객체 이상이 서로를 참조할 때 참조가 끊기지 않는 문제점이 발생

쉽게 생각하면 메모리가 해제되야 하는 상황에서 서로를 참조하게 되어 해제되지 않는 상태라 볼 수 있습니다.

메모리 누수 만들어 보기(?)

메모리 누수를 알기위해 먼저 구현해 봅시다!

먼저 메모리 누수를 이르킬 객체들을 구현합니다

class AClass {
    var aProperty: BClass?
}

class BClass {
    var bProperty: AClass?
}

class SecondVC: UIViewController {
    
    var a = AClass()
    var b = BClass()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        self.view.backgroundColor = .red
    
        // 이 부분에서 서로를 참조하여 사이클이 발생!!
        a.aProperty = b
        b.bProperty = a
    }
}

이제 이 메모리 누수를 관찰할 수 있는 방법들에 대해 설명해 드리겠습니다.

1. Debug Memory Graph

Debug Memory Graph는 힙의 영역에 대한 메모리 스냅샷을 찍어서 보여주는 도구입니다.

Xcode의 아래쪽에 보면 위와같은 버튼이 있는데 이걸 누르면?

이런 그래프들을 볼 수 있습니다!

그림을 보면 연한 화살표와 진한 화살표가 있는데,
진환 화살표는 강한참조를 연한 화살표는 약한참조를 나타냅니다!

이제 이 그래프를 이용하여 순환 참조가 어디서 일어나는지 찾아볼 수 있는데요,

위의 사진처럼 강한 참조로 같은 메모리를 순환하여 참조하는 것을 볼 수 있습니다.

또 다른 방법으로는 메모리의 사용량을 모니터링 하는 방법이 있는데요,

위와 같이 할당된 메모리가 해제되지 않아 계속 메모리 사용량이 증가하는 것을 볼 수 있습니다..!

2. Leaks Instrument

Leaks Instruments는 앱의 메모리 사용을 모니터링 하고 관리하는 도구 인데요,

사용하려면 Product -> Profile로 접근하거나
단축키 Command + i를 눌려 접근합니다.

그리고 Leaks를 선택합니다.

그러면 위와 같은 화면을 볼 수 있습니다.
간략히 설명 드리자면,

Allocations는 앱에서 발생한 모든 메모리 할당과 해제 이벤트를 기록하고,

Leaks는 앱에서 메모리 누수를 감지합니다.

사용방법은 왼쪽 위의 녹음 버튼을 통해 녹음을 시작하고, 메모리 누수가 의심되는 객체의 이름으로 필터링 하여 관찰할 수 있습니다.

위 예시처럼 만약 메모리 누수가 일어나면 바로 표시해줍니다.
또, 순환 참조가 어떻게 일어나고 있는지 그래프롤 통해 알려주기도 합니다

정리

오늘은 메모리 누수가 뭔지, 어떻게 발견 하는지에 대해 설명드렸습니다.
평소에 메모리 관리에 관해 신경쓰지 않고 있었는데, 지금 진행하는 프로젝트도 메모리 누수가 있는지 확인해야 할것 같네요..

다음에는 어떻게 메모리 누수를 해결할 수 있는지에 대해 설명해 드리겠습니다!

읽어주셔서 감사합니다~

참고 자료

https://ios-daniel-yang.tistory.com/61

profile
기록하는 개발자

0개의 댓글