안녕하세요, Annie 입니다 :)
너무 오랜만에 하는 포스팅..!
오늘은 swift에서 사용하는 ARC에 대해서 알아보도록 하겠습니다 !
ARC는 Automatic Refence Counting 의 준말로 자동으로
메모리 관리를 해주는 모델을 말합니다.
Object-c의 경우에는 할당된 데이터를 직접 해지했어야 했는데 swift는
ARC를 통해 사용되지 않는 데이터에 대해 자동으로 메모리를 해지해줍니다.
할당된 데이터가 해제되지 않으면 메모리누수(Memory Leak)가 발생하기 때문에 메모리 해제는 필수 !
(출처: WWDC21 https://developer.apple.com/videos/play/wwdc2021/10216/)
- 객체는 init()으로 시작하며 더 이상 사용되지 않을 때 ARC를 통해 메모리를 해제한다.
- ARC는 Refence Count(RC)를 통해 메모리 해제시점을 관리한다.
- Swift는 컴파일러 시점에 자동으로 retain과 release 함수를 넣고 RC가 0이 되었을 때 런타임 시점에 메모리를 해제시킨다.
그럼 retain과 release 함수라는 건 뭘까요?
- retain : reference count 증가를 통해 현재 Scope에서 객체가 유지되는것을 보장
- release : reference count를 감소시킴. retain 후에 필요 없을 때 release 함
따라서, ARC는 컴파일 시점에 retain과 release 함수를 자동으로 삽입하여 RC가 0이 될 때 자동으로 메모리를 해제해주는 메모리관리 시스템 입니다.
이 메모리 관리는 메모리의 어느 영역에서 이루어져야 할까요?
메모리는 코드-데이터-힙-스택 으로 총 4단계로 이루어져있습니다.
이 중 힙(Heap)은 참조타입의 데이터가 저장되고, 개발자가 동적메모리를 할당하는 공간입니다. 따라서, 이 공간에서 메모리 관리가 이루어져야 하고 이는 ARC를 통해 이루어집니다.
ARC 작동원리에 대해 자세히 알아 보기 전 참조타입과 그와 비교되는 값타입에 대해서도 짧게 알아보도록 하겠습니다 !
그럼 ARC 가 어떤 식으로 작동 되는지 알아보겠습니다.
위의 그림을 보면 Traveler 클래스를 참조하는 traveler1 인스턴스가 생성 될 때
참조가 시작 되고 traveler2가 생성된 후 참조가 완료됩니다.
이 후에 complier는 끝나는 지점에 release 를 넣어 참조카운트가 줄어 들도록 합니다.
여기서 traveler1 앞에 retain 이 삽입되지 않는 이유는 init()을 하게되면 자동으로 참조카운트가 1이 되기 때문입니다.
그럼 런타임시 어떤 작용이 일어나는지 확인해보겠습니다.
처음에 traveler1는 Traveler 클래스의 인스턴스로서 생성되며 이로인해 Traveler의 참조카운트는 1이 됩니다.
이 후 traveler2가 traveler1을 참조하기 때문에 retain 이 삽입되게 되고
Traveler 의 참조카운트는 1 증가한 2가 됩니다.
traveler1의 사용이 끝나면 release가 삽입되고 Traveler 의 참조카운트는
1이 줄어들어 다시 1이 됩니다.
traveler2의 destination이 업데이트 된 후 더이상 사용되지 않기 때문에 release가 삽입되었고 Traveler 의 참조카운트는 1이 더 줄어들어 0이 됩니다.
참조카운트가 0이 되면 Traveler 인스턴스는 메모리에서 해제되게 됩니다.
위의 그림을 보면 객체의 Lifetime은 init()과 함께 시작되고 더이상 사용 되지 않을 때 끝나게 됩니다.
이런 ARC 방식을 통해 참조카운트를 증감시키고 0이 되면 메모리해제가 자동으로 이루어지게 됩니다 !
이렇게 ARC가 어떤 것이고 왜 작동되는지에 대해서 알아보았습니다!
ARC를 통해 대부분 메모리가 관리가 되어서 메모리 누수가 발생하지 않는데요.
특수한 경우(강한참조싸이클)엔 메모리해제가 되지않아 따로 작업을 해줘야 하는 경우가 있는데
이 경우에 대해선 따로 포스팅을 하겠습니다.
저도 잘 몰랐던 개념인데 이렇게 적어보면서 다시 정리하게 되었네요 :-)
혹시 잘못된 개념이 있거나 보충해야 할 부분이 있다면 편하게 알려주세요 !
읽어주셔서 감사합니다! swift 문법 뿌셔뿌셔!