[Swift] ARC (Automatic Reference Counting)
https://babbab2.tistory.com/26
메모리 구조 간단 정리
- Text (Code) : 컴파일된 소스코드 저장
- Data : 전역변수, static 변수 저장
- Heap : 참조 타입 저장 - 클래스 인스턴스, 클로저
- Stack : 함수의 지역변수, 매개변수, 리턴값 저장
[Swift] 참조 타입 선언 시 힙과 스택의 동작
스위프트는 참조 타입(인스턴스, 클로저 등)을 선언할 때 자동으로 힙에 할당한다.
우리가 지역변수로 클래스 인스턴스를 만들면...
let rice = Food(name: "rice")
- 힙 :
name = rice인 Food 인스턴스가 할당됨
- 스택 : 지역변수
rice가 할당되며, 힙에 할당된 인스턴스를 참조함(인스턴스의 주솟값을 저장)
ARC란?
ARC는 메모리구조 중 힙(heap) 영역에 할당된 메모리를 관리한다.
ARC = Automatic Reference Counting 자동 참조 카운팅
ARC는 클래스 인스턴스가 더 이상 필요하지 않을 때 메모리를 자동으로 해제한다.
GC 와 RC, MRC와 ARC
GC & RC : 힙 메모리를 관리하는 두 가지 방법.
둘의 가장 큰 차이는 "참조를 계산하는 시점"이다.
스위프트의 ARC는 RC에 속한다.
- GC = Garbage Collection (자바)
- 런 타임에 참조 계산 : 실행 동안 주기적으로 참조 추적
- 장 : RC에 비해 인스턴스 해제 확률이 높음
- 단 : 개발자가 참조 해제 시점을 알 수 없음, 추적을 위한 추가 리소스가 필요해 성능 저하
- RC = Reference Counting
- 컴파일 타임에 참조 계산 : 언제 참조/해제될지 결정 후 런 타임에 그대로 실행
- 장 : 개발자가 참조 해제 시점을 알 수 있음, 런 타임에 추가 리소스 필요 없음
- 단 : 순환참조 발생 시 메모리 누수 발생 가능
MRC & ARC : RC의 두 유형
- MRC : Manual Reference Counting (수동)
- 힙에 메모리를 직접 할당/해제한다
retain, release 같은 함수를 사용
- Objective-C(2011년 이전)가 사용하던 방식
- ARC : Automatic Reference Counting (자동)
- 힙에 자동으로 메모리를 할당/해제한다
- Swift(2014-), Objective-C(2011년 이후)가 사용하는 방식
RC (참조 횟수) - ARC의 메모리 관리 방법
RC = Reference Count (참조 횟수)
- 어떤 인스턴스가 참조되는 횟수를 숫자로 나타낸 것.
- RC = 0 이 되면 더 이상 참조되지 않는 인스턴스이므로 메모리에서 해제된다.
- 모든 인스턴스는 자신의 RC 값을 가짐
RC 계산 - 증가하는 시점
인스턴스의 주소값이 변수에 할당될 때 RC가 1 더해진다.
- 인스턴스를 새로 생성할 때
let rice = Food(name: "rice")
- 기존 인스턴스를 다른 변수에 대입할 때
RC 계산 - 감소하는 시점
- 인스턴스를 가리키던 변수가 메모리에서 해제되었을 때
- (옵셔널) nil이 할당되었을 때
- 변수에 다른 값을 대입
- (프로퍼티의 경우) 프로퍼티의 클래스 인스턴스가 메모리에서 해제될 때
- 프로퍼티가 같이 해제되는 것이 아닌, RC가 1 감소하는 것이다.