728x90
Automatic Reference Counting
- Swift의 메모리 사용량을 추적하고 관리하는 기법
- 인스턴스가 필요하지 않을 때, 클래스 인스턴스가 사용하는 메모리를 자동으로 해제
- 클래스의 인스턴스에만 적용
- 구조체와 열거형은 값 타입으로 참조로 저장 및 전달되지 않음
- 작동 방식
- 클래스의 인스턴스를 생성할 때, ARC는 메모리를 할당
- 인스턴스와 관련된 저장 프로퍼티의 값, 인스턴스 타입에 대한 정보 저장
- 인스턴스가 더 이상 필요하지 않을 때, ARC는 메모리를 비움
- 클래스의 인스턴스를 생성할 때, ARC는 메모리를 할당
- 인스턴스가 필요한지 확인하기 위해 클래스 인스턴스를 속성, 상수, 변수에 할당할 때마다 인스턴스에 대한 strong 참조를 만듦
- weak 참조
- 참조 횟수를 증가시키지 않음
- 참조되는 인스턴스가 참조하는 인스턴스보다 수명이 짧은 경우 사용
- 오버헤드 발생
- weak 하게 참조될 때, weak reference storage 할당
- 32 바이트의 메모리 비용
- 런타임 비용 최대 10배
- unowned 참조
- weak 참조의 강제 언래핑 버전
- 참조되는 인스턴스가 참조하는 인스턴스보다 수명이 비슷하거나 더 길 때 사용
- 오버헤드 없음
- 메모리 비용 없음
- 런타임 비용 최대 4배
- 참조하는 대상은 unowned가 존재하면 할당 해제될 수 없다.
- 메모리 낭비 발생
- 참조하는 대상의 수명이 얼마나 될지 모른다면, weak 참조를 통해 오버헤드를 감수할 만 함
Memory Reachability
- 힙에는 3개의 메모리 종류가 있음
- Useful memory: 재사용되며 도달 가능한 메모리
- Abandoned memory: 재사용되며 도달 가능하지만 사용되지 않는 메모리
- Leaked memory: 재사용되지 않고 도달 불가능한 메모리
Memory Leak
- 메모리에 할당되었지만 반환되지 않고, 참조되지 않는 것
- 참조할 수 없기 때문에 반환할 수 없음
Retain Cycle
- 인스턴스가 할당 해제되지 않도록 참조 상 순환을 이루는 상태
- 둘 이상의 인스턴스가 서로에 대한 strong 참조를 보유할 때 발생
Copy on Write
- 프로퍼티를 복사할 때, 데이터를 복사하는 대신 동일한 저장 공간을 공유하고 있다가 수정이 생길 때 별도의 복사본을 만드는 방법
- 데이터를 복사하는 대신 필요한 시점에 복사하기 때문에 메모리를 효율적으로 사용
- 대용량 데이터나 공유 자원을 다룰 때 유용
728x90