[Swift] ARC: Automatic Reference Counting

Jay Lee
5 min readJul 3, 2021

--

안녕하세요 :)

오늘은 ARC, Automatic Reference Counting 에 대해 이야기 해보겠습니다.

Swift 공식 Document에서는 ARC를 이렇게 설명하고 있습니다.

ARC 란

Swift가 앱의 memory를 자동으로 관리할 수 있도록 사용하는 것이다. 거의 대부분의 경우에 당신은 메모리 관리에 대해서 신경을 쓰지 않아도 될 것이다.
ARC 가 자동으로 더 이상 사용하지 않는 메모리를 자동으로 처리할 것이기 때문이다.

iOS 개발자로서 한정되어 있는 자원(배터리)를 효율적으로 사용하기 위해 Memory leak 등을 조심해야한다는 점은 주지의 사실인데요.

거의 대부분의 경우에 메모리 관리를 하지 않아도 된다니 뭔지는 몰라도 아주 좋은 녀석 같아보입니다.

하지만, 바로 아래에 아래와 같은 말이 있습니다.

A. 그러나 ‘몇 가지 '의 경우에 ARC 는 메모리 관리를 위해 당신의 코드에 대해 더 많은 정보를 필요로 한다.
B. ARC는 class, instance 와 같은 reference type 에만 적용되고, structure 과 enumeration 과 같은 value type에는 적용되지 않는다.

B. 같은 경우에는 어떻게 보면 당연한 이야기겠죠.
그림의 정보와 같이 class의 instance들은 structure과는 다르게 reference 타입으로 Heap 영역에 저장됩니다.

따라서 따로 처리를 해주지 않는다면 해당 class가 계속 참조되고 있어, 메모리를 차지하고 있게 되는 것이죠.

자 이제 A 에서 말한 ARC가 우리를 대신해서 메모리를 관리하기 위해 정보를 필요로 하는 그 ‘몇 가지' 경우에 대해서 알아볼까요.

How ARC Works

ARC는 매번 당신이 class의 instance를 생성할 때 마다 ARC 는 해당 instance에 메모리를 할당합니다. 할당된 메모리에는 해당 instance의 type과 instance와 연결된 stored property가 저장 되죠. 그리고 그 instance가 더 이상 필요없어졌을 때 ARC 는 해당 메모리를 비우게 됩니다.

하지만 ARC가 아직 사용되는 instance의 메모리를 비워버린다면?

큰일 나겠죠 ㅋ

그래서 ARC 는 모든 class의 property, contstant, variable 들의 갯수를 Counting 합니다. 그래서 이 중 단 하나라도 사용되는 것이 있다면 해당 메모리를 정리하지 않는 것이죠.

그리고 이것을 구현하기 위해 class instance 는 강력한 참조 를 만들어냅니다.
strong reference 가 존재하는 한 해당 메모리는 절대 비워지지 않습니다. 그 것이 strong 이라고 이름이 붙여진 이유이기도 합니다.

지난 OOP part.2 포스팅에서 Inheritance 상속은 고강도의 Coupling이라고 말씀 드린 적도 있었죠.

“ To make this possible, whenever you assign a class instance to a property, constant, or variable, that property, constant, or variable makes a strong reference to the instance. ” (swift.org document — How ARC Works)

자 그러면 실제로 ARC 는 어떻게 Counting 을 할까요

아래 사슴 class가 있습니다.

initialize 될 때, 또 deinit 될 때 각각 해당 내용을 프린트해줍니다.

그리고 (왼쪽) reference 1,2,3 instance를 생성한 후에,
(오른쪽) reference1을 init 해주고, reference2와 reference3을 같이 참조해준 뒤,
reference1 과 reference2에 nil 을 할당해줍니다.

그러면 여기서 문제

다음과 같은 상황에서 deinit 문장이 print 될까요?

정답은: Nope

reference 중 단 하나라도 사용되는 것이 있다면 ARC 는 해당 메모리를 절대 비우지 않는다고 했죠.

reference3 까지 nil을 할당해준 뒤에야 비로소 우리의 루돌프는 deinit이 됩니다.

정리

ARC 는 Class 의 instance 가 생성될 때 메모리를 할당하며,
해당 instance에 강력한 strong reference를 생성하고,
그 것의 갯수를 Counting 한다.
그 중 단 한개라도 사용되고 있는 것이 있다면, 해당 메모리는 절대 비워지지 않는다.

resources: swift.org_ ARC

--

--

Jay Lee

iOS Developer 🇰🇷🇬🇧