관리 메뉴

김종권의 iOS 앱 개발 알아가기

[iOS - swift] Memory Leak 쉽게 테스트하는 방법 (Symbolic Breakpoint) 본문

iOS 응용 (swift)

[iOS - swift] Memory Leak 쉽게 테스트하는 방법 (Symbolic Breakpoint)

jake-kim 2023. 9. 13. 01:58

일반적인 방법 - deinit에서 출력

  • deinit은 class타입에서 해당 인스턴스가 메모리 해제 될 때 호출되므로 이 부분을 출력되는것을 확인하여 쉽게 memory leak이 나고 있지 않다는 확인이 용이
// BaseViewController.swift

deinit {
    print("DEINIT: \(self)")
}
  • 위처럼 구현하면 콘솔창을 일일이 확인해야하므로, 조금 더 편한 방법은 UIViewController가 메모리 해제될 때 소리로 알려주는 방법

메모리 해제될 때 소리로 알려주는 방법

  • 특정 break point가 실행될 때 Xcode에서 소리가 나게끔하는 방법이 존재
  • 특정 UIViewController를 닫을 때, 메모리 해제되는 타이밍에 소리가 나게끔 설정해놓고 만약 소리가 나지 않는다면 memory leak이라고 쉽게 판단이 가능
  • symbolic breakpoint를 사용하여 구현

Symbolic Breakpoint을 이용한 Memory Leak 테스트

  • Xcode에서 break point를 모아놓는 탭 클릭 > + 버튼을 누른 후 Symbolic Breakpoint 선택

  • Symbol에 -[UIViewController dealloc]을 입력하여 delloc 메소드 심볼을 입력

  • Add Action 버튼 클릭 > Sound 선택

  • 콘솔에 출력하는 기능도 넣기 위해서, Action의 + 버튼 클릭
    • 카테고리는 Log Message 선택
    • 메세지는 DEINIT: @(id)[$arg1 description]@로 입력

  • 일반적으로 break point를 걸면 그 포인트에 도달 시 앱이 잠시 일시정지되어, lldb 디버깅 되는 모드가 있지만 매번 일시정지되지 않는것을 원하므로 "Automatically continue after evaluating actions" 선택 체크

(완료)

  • MyVC라는 UIViewController를 dismiss하면 위에서 정의한 소리와 함께 console에 메시지가 출력
    • DEINIT: @"<ExMemoryLeakTest.MyVC: 0x138128e80>"

* 전체 코드: https://github.com/JK0369/ExMemoryLeakTest

* 참고

https://sarunw.com/posts/easy-way-to-detect-retain-cycle-in-view-controller/

Comments