본문 바로가기
Languages/Swift

Swift Memory Management

by 탄이. 2018. 12. 30.

Swift Memory Management

  • 스위프트는 ARC로 메모리 관리를 한다.

ARC

  • 자동 참조 계수(Automatic Reference Counting)

    • 인스턴스가 더 이상 필요없을 때 사용된 메모리를 자동으로 해제해준다.

강한 순환 참조

  • ARC로 메모리를 관리할 때 발생할 수 있는 문제이다.

  • 두 개의 객체가 서로 강한 참조를 하는 경우 발생할 수 있다.

  • 해결법

    • 서로 강한 참조를 하는 경우 발생한다면, 둘 중 하나의 강한 참조를 변경해주면 된다.

    • 강한 참조를 약한(weak) 참조 혹은 미소유(unowned) 참조로 변경하면 강한 순환 참조 문제를 해결할 수 있다.

    • 약한 참조는 옵셔널일 때 사용하고, 미소유 참조는 옵셔널이 아닐 때 사용한다.

  • 클로저에서의 강한 순환 참조

    • 클래스처럼 클로저는 참조 타입이기 때문에 강한 순환 참조가 발생할 수 있다.

    • 클래스 인스턴스의 프로퍼티에 클로저를 할당 할 때 클로저에 참조를 할당하기 때문에 강한 순환 참조가 발생할 수 있고,

    • 클로져의 본문이 인스턴스를 캡쳐(capture)할 때 클로저가 self를 캡쳐하게 되면서 강한 순환 참조가 발생할 수 있다.

    • 캡쳐(capture)

      • 클로저의 본문에서 인스턴스의 프로퍼티에 접근하거나 인스턴스의 메소드를 호출하는 것을 캡쳐(capture)라고 한다.

    • 해결법

      • 클로저와 클래스 인스턴스 사이에서 강한 순환 참조 해결법은 클로저의 선언부에서 캡쳐 목록(capture list)을 정의하는 것으로 해결할 수 있다.

      • 캡쳐 목록은 클로저 본문에 하나 이상의 참조를 캡쳐할 때 사용하는 규칙을 정의한다.

      • 두 클래스 인스턴스 사이에서의 강한 순환 참조 때 처럼, 강한 참조 대신 약한 참조 혹은 미소유 참조로 선언해서 정의한다.

      • 상황에 따라서 약한 참조와 미소유 참조 중 선택해서 사용한다.


댓글