JB
4 min readSep 22, 2020

[iOS Swift] Swift의 메모리 관리기법 (ARC)

  1. Automatic Reference Counting (ARC)

Swift는 앱의 메모리사용을 관리하고 추적하기위해 Automatic Reference Count( ARC )를 사용합니다.

스위프트 메모리 관리 기법이 강력하고 편리하다고 할 수 있는데 그 이유는 클래스 인스턴스에 할당된 메모리들을 인스턴스들이 필요하지 않을 때 자동적으로 메모리를 비워 준다는 점 입니다.

2. ARC의 작동 원리

클래스의 새로운 인스턴스를 만들 때 마다 ARC는 메모리에 그 인스턴스들의 정보들을 할당합니다. 이 메모리에는 그 인스턴스의 타입 뿐만 아니라 stored properties들도 같이 할당하게 됩니다. 이 때, strong(강하게) 참조를 하고 있다면 reference count가 +1이 됩니다.

후에 메모리에 할당 되어진 인스턴스들이 필요하지 않게 되면, 그때 ARC는 자동적으로 (개발자가 수동적으로 release나 retain을 사용하지않고) 사용하지 않는 인스턴스들을 메모리에서 지워주게 되고, reference count가 -1이 되게 됩니다.

그러나, 할당해지(deallocate)되었지만 그 인스턴스를 사용중이라면, 그 앱은 crash가 나게 됩니다.

애플에서 제공하는 예제 입니다.

Initializer와 Deinitializer가 있는 Person이라는 클래스를 생성하였고,

reference 변수 생성

reference 변수들을 생성하였습니다. 그리고,

reference1에 name 할당

reference1에 name을 할당해주었습니다. reference1 변수는 이제 강하게(strong) Person 인스턴스와 참조하게 되었고 Person클래스의 initializer가 불릴 시점에 “John Appleaseed is being initialized”라는 메시지가 호출됩니다.

reference2, 3에 reference1 할당

그 후에 Person 인스턴스에 대한 강한 참조를 reference 2와 reference 3에도 할당합니다.

reference1,2 값을 nil

reference1과 reference2의 값을 nil로 주어도 deinit이 호출되지 않는 것을 볼 수 있는데 이는 reference1과 reference2가 nil값이 되었다 하더라도 아직 reference3값이 강한참조로 Person인스턴스와 연결되어있기에 deinit이 불리지 않습니다.

reference3 값에 할당

reference3를 nil값으로 주어야만 deinit이 불리고 이는 Person 인스턴스가 reference들과의 강한 참조가 해지 되었다고 볼 수 있습니다.

JB
JB

Written by JB

iOS engineer @kakaobank

No responses yet