티스토리 뷰

언어 소개 - Swift

Swift - ARC

최초의 펭귄 2018. 5. 25. 18:00

안녕하세요. 오늘은 Swift의 메모리를 관리하는 ARC(자동 참조 갯수)에 대해 알아 보겠습니다.
블로그의 내용은 때로는 까칠하게님의 블로그의 내용을 각색하여 작성하였습니다.

ARC 작동 방식

클래스의 새로운 인스턴스를 만들 때 ARC는 인스턴스의 정보를 저장하기 위해 메모리를 할당합니다.
또한 ARC는 인스턴스가 더 이상 사용되지 않는다고 판단하면 메모리를 해제합니다.
레퍼런스 프로퍼티에 인스턴스를 할당하면 ARC는 참조되는 프로퍼티의 갯수를 카운팅하여
참조하는 모든 변수가 인스턴스를 해제하기 전에 ARC는 인스턴스를 메모리에서 해제하지 않습니다.

강한 순환 참조

상호간의 인스턴스 안에서 서로의 인스턴스를 참조하는 프로퍼티가 있다면
두 인스턴스를 해제하여도 ARC는 두 인스턴스를 메모리에서 해제하지 않습니다.
이러한 상황은 메모리 누수가 생기도록 만듭니다.

강한 순환 참조 해결하기

Swift에서는 강한 순환 참조를 해결하는 방법으로 weak와 unowned라는 참조 방법을 제공합니다.
두 참조 방법은 ARC가 프로퍼티의 갯수를 카운팅 하지 않도록 만들며
카운팅이 되지 않기에 순환 참조가 일어나지 않도록 만듭니다.

그렇기에 두 참조 방법을 사용하는 프로퍼티의 인스턴스는 사용하는 동안 ARC에 의해
인스턴스가 메모리에서 해제될 수 있습니다.

weak와 unowned의 차이는 ARC에 의해 인스턴스가 메모리에서 해제 될 때
어떻게 동작하는지에 있습니다.

weak 참조

weak 참조는 ARC에 의해 참조되는 인스턴스가 메모리에서 해제 될 때
프로퍼티의 값을 nil로 만듭니다. (그렇기에 기본적으로 weak 프로퍼티는 옵셔널 값입니다.)

unowned 참조

weak 참조와 달리 ARC에 의해 참조되는 인스턴스가 메모리에 해제되도
프로퍼티의 값을 nil로 만들지 않으며 메모리가 해제 된 뒤
unowned 프로퍼티에 접근하면 런타임 에러가 발생합니다.
(그렇기에 참조가 항상 존재하는 인스턴스를 참조할 때 unowned 참조를 사용합니다.)

클로저에서 강한 순환 참조

클로저를 통해 인스턴스의 참조를 하고 있고 이 클로저를 인스턴스가 참조하는 프로퍼티가 있다면
순한 참조가 생겨 인스턴스를 해제하여도 인스턴스와 클로저 모두 메모리에서 해제 되지 않습니다.

클로저의 강한 순환 참조 해결하기

방법은 위에서 소개한 weak와 unowned를 사용합니다.
클로저는 인스턴스를 참조할 때 인스턴스를 캡쳐합니다. 우리는 이 캡처하는 참조를 weak와 unowned로 설정할 수 있습니다.
클로저의 선언부에서 캡쳐 목록을 정의하여 강한 순환 참조를 해결할 수 있습니다.
weak와 unowned의 동작은 위와 같습니다.

마치며

자바의 GC처럼 Swift는 ARC를 통해 필요하지 않는 메모리를 해제합니다.
하지만 예기치 못하는 메모리 누수를 예방하여야 더욱 성장하는 개발자라고 생각합니다.
(이렇게 쓰는 저도 잘... ^^)
ARC와 참조에 대한 도움이 되셨기를 바라며
오류나 질문은 하단의 댓글로 남겨주세요!

감사합니다.

'언어 소개 - Swift' 카테고리의 다른 글

Swift - 흐름 제어  (0) 2018.05.29
Swift - 함수  (0) 2018.05.28
Swift - 사용자 정의 연산자  (0) 2018.05.21
Swift - 고급 데이터 타입  (0) 2018.05.15
Swift - 애플의 새 언어  (0) 2018.05.12
댓글
공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday