[Xcode] Instruments (2) - 활용예시

이전 포스팅에서 instruments의 구성요소들과 개념들을 알아보았습니다.

이번에는 instruments를 활용하여 메모리 누수를 잡아보겠습니다.

예시 코드

예시는 https://www.youtube.com/watch?v=sp8qEMY9X6Q 영상의 코드를 참고하였습니다.

전체 코드

import UIKit

class ViewController: UIViewController {

    override func viewDidLoad() {
        super.viewDidLoad()
        // rightBarButton 추가
        navigationItem.rightBarButtonItem = UIBarButtonItem(title: "Show Red", style: .plain, target: self, action: #selector(handleShowRedController))
    }
	// button 기능
    @objc func handleShowRedController() {
        navigationController?.pushViewController(RedController(), animated: true)
    }
}
// 참조 class
class Service {
    var redController: RedController?
    
}
// navigation push ViewController
class RedController: UITableViewController {
    // 소멸시 출력될 키워드
    deinit {
        print("OS reclaming controller")
    }
    
    let service = Service()
    
    override func viewDidLoad() {
        super.viewDidLoad()
        tableView.backgroundColor = .red
        
        service.redController = self
    } 
}

instruments profiles 중에서 Allocations를 선택하고
Detail pane에서 가장 하단의 filter 부분에서 instrument를 넣으면
아래와 같은 Detail pane을 볼 수 있습니다.

여기서 주목할만한 부분은 # 과 # Transient부분입니다.
#은 현재 메모리에 할당된 각 객체의 수가 계산되어 나타나고
#Transient는 할당해제된 객체 수가 표시됩니다.

위의 코드를 돌려보면 아래와 같이 강한참조가 일어나는 것을 알 수 있습니다.

그래서 이 강한참조사이클을 방지하고자 weak 키워드를 사용하여
참조 class를 고치면 할당해제됨을 알 수 있습니다.

// 참조 class
class Service {
    weak var redController: RedController?
    
}

간단한 예제를 통해 instruments를 이용하여 reference cycle을 시각적으로 살펴보고 메모리를 관리 할 수 있었습니다.

좋은 웹페이지 즐겨찾기