Swift Memory Management
스위프트는 ARC로 메모리 관리를 한다.
스위프트는 ARC로 메모리 관리를 한다.
ARC
자동 참조 계수(Automatic Reference Counting)
인스턴스가 더 이상 필요없을 때 사용된 메모리를 자동으로 해제해준다.
자동 참조 계수(Automatic Reference Counting)
인스턴스가 더 이상 필요없을 때 사용된 메모리를 자동으로 해제해준다.
강한 순환 참조
두 개의 객체가 서로 강한 참조를 하는 경우 발생할 수 있다.
해결법
서로 강한 참조를 하는 경우 발생한다면, 둘 중 하나의 강한 참조를 변경해주면 된다.
강한 참조를 약한(weak) 참조 혹은 미소유(unowned) 참조로 변경하면 강한 순환 참조 문제를 해결할 수 있다.
약한 참조는 옵셔널일 때 사용하고, 미소유 참조는 옵셔널이 아닐 때 사용한다.
클로저에서의 강한 순환 참조
클래스처럼 클로저는 참조 타입이기 때문에 강한 순환 참조가 발생할 수 있다.
클래스 인스턴스의 프로퍼티에 클로저를 할당 할 때 클로저에 참조를 할당하기 때문에 강한 순환 참조가 발생할 수 있고,
클로져의 본문이 인스턴스를 캡쳐(capture)할 때 클로저가 self를 캡쳐하게 되면서 강한 순환 참조가 발생할 수 있다.
캡쳐(capture)
클로저의 본문에서 인스턴스의 프로퍼티에 접근하거나 인스턴스의 메소드를 호출하는 것을 캡쳐(capture)라고 한다.
해결법
클로저와 클래스 인스턴스 사이에서 강한 순환 참조 해결법은 클로저의 선언부에서 캡쳐 목록(capture list)을 정의하는 것으로 해결할 수 있다.
캡쳐 목록은 클로저 본문에 하나 이상의 참조를 캡쳐할 때 사용하는 규칙을 정의한다.
두 클래스 인스턴스 사이에서의 강한 순환 참조 때 처럼, 강한 참조 대신 약한 참조 혹은 미소유 참조로 선언해서 정의한다.
상황에 따라서 약한 참조와 미소유 참조 중 선택해서 사용한다.
두 개의 객체가 서로 강한 참조를 하는 경우 발생할 수 있다.
해결법
서로 강한 참조를 하는 경우 발생한다면, 둘 중 하나의 강한 참조를 변경해주면 된다.
강한 참조를 약한(weak) 참조 혹은 미소유(unowned) 참조로 변경하면 강한 순환 참조 문제를 해결할 수 있다.
약한 참조는 옵셔널일 때 사용하고, 미소유 참조는 옵셔널이 아닐 때 사용한다.
클로저에서의 강한 순환 참조
클래스처럼 클로저는 참조 타입이기 때문에 강한 순환 참조가 발생할 수 있다.
클래스 인스턴스의 프로퍼티에 클로저를 할당 할 때 클로저에 참조를 할당하기 때문에 강한 순환 참조가 발생할 수 있고,
클로져의 본문이 인스턴스를 캡쳐(capture)할 때 클로저가 self를 캡쳐하게 되면서 강한 순환 참조가 발생할 수 있다.
캡쳐(capture)
클로저의 본문에서 인스턴스의 프로퍼티에 접근하거나 인스턴스의 메소드를 호출하는 것을 캡쳐(capture)라고 한다.
해결법
클로저와 클래스 인스턴스 사이에서 강한 순환 참조 해결법은 클로저의 선언부에서 캡쳐 목록(capture list)을 정의하는 것으로 해결할 수 있다.
캡쳐 목록은 클로저 본문에 하나 이상의 참조를 캡쳐할 때 사용하는 규칙을 정의한다.
두 클래스 인스턴스 사이에서의 강한 순환 참조 때 처럼, 강한 참조 대신 약한 참조 혹은 미소유 참조로 선언해서 정의한다.
상황에 따라서 약한 참조와 미소유 참조 중 선택해서 사용한다.
댓글