본문 바로가기
TIL (Today I Learned)

[Swift] ARC (Automatic Reference Counting)

by Bokoo14 2024. 2. 16.

[참고]

더보기

📝 ARC?

 Automatic Reference Counting약자, 자동 참조 계수, 체의 참조가 사용되고 있는지 추적하기 위한 장치

ARC는 해당 인스턴스를 참조하는 다른 인스턴스의 프로퍼티나 변수, 상수 등의 개수를 세고, 해당 인스턴스에 대한 활성 참조가 1개 이상 존재하는 한 인스턴스를 메모리에서 없애지 않는다. 

 

ARC이전에는 MRC, MRR 등 개발자가 수동으로 직접 메모리 관리를 해줘야 했다.

참조타입은 여러 곳에서 접근이 가능하기에 언제 메모리에서 해제되는지 중요하다.

참조 시점을 알기 위해 레퍼런스 카운팅을 해야 한다. 

자바의 가비지 컬렉션 기법과 달라서, 메모리 해제 시점과 관련해 정확한 이해가 필요하다.

  • 클래스의 인스턴스에서만 적용
  • 객체 생성 및 공유 시 마다 카운터(참조횟수)를 업데이트 해줌
  • 참조타입의 할당 및 해제 시점을 자동으로 관리
  • 해제 시점이 컴파일 시 정해져 있음

 

💡 강한참조

프로퍼티, 변수, 상수에 대해 기본값으로 설정되어 있는 참조 옵션

  • 참조횟수 0일시 해제되고 디이니셜라이저가 호출된다 (자동)
  • 여러개의 인스턴스가 서로 참조할 시 강한 참조 순환 문제 발생 가능성이 있다.
  • 메모리 해제 시점에 대한 이해가 없이 사용 시 인스턴스가 영원히 메모리에서 해제 되지 않기에 메모리 누수가 발생할 수 있음(약한참조 혹은 미소유참조로 해결할 수 있음)

 

💡 약한참조

weak 옵션 키워드를 붙여 생성

  • 자신이 참조하는 인스턴스의 참조횟수를 증가시키지 않음
  • 항상 옵셔널로 사용

💡 미소유참조

unowned 옵션 키워드를 붙여 생성한다.

  • 참조하는 인스턴스가 항상 메모리에 존재할거라는 기반을 가지고 사용

📝 ARC vs GC

ARC와 GC의 가장 큰 차이는 바로 참조 카운팅 시점

 

GC는 프로그램 실행 중에 동적으로 메모리를 감시

ARC는 놀랍게도 컴파일 시점에 메모리에서 해제되는 시점을 결정

 

GC의 경우에는 Garbage Collector가 계속해서 메모리를 감시하고 있기 때문에 성능 저하가 발생할 수 있음

더이상 사용할 필요가 없다고 여겨지는 것을 메모리에서 삭제해 준다. (실행타임에서 메모리 관리)

정확히 어느 시점에 인스턴스가 메모리에서 해제되는지 예측하기가 어렵다.

계속해서 메모리를 감시하기 때문에 인스턴스가 해제될 가능성이 더 높다.

 

 ARC컴파일 시점에 인스턴스 해제 시점이 결정되어 있어 성능 저하는 발생하지 않는다.

개발자가 메모리에서 해제되는 시점을 알 수 있다.

순환참조가 발생한다면 영원히 인스턴스가 메모리에서 해제되지 않을 가능성이 존재

 

  GC RC
참조 계산 시점 Run Time

▪ 어플 실행 동안 주기적으로 참조를 추적하여
사용하지 않는 instance를 해제함
Compile Time

▪ 컴파일 시점에 언제 참조되고 해제되는지
결정되어 런타임 때 그대로 실행됨
장점 ▪ 인스턴스가 해제될 확률이 높음
(RC에 비해)
▪ 개발자가 참조 해제 시점을 파악할 수 있음
▪ RunTime 시점에 추가 리소스가 발생하지 않음
단점 ▪ 개발자가 참조 해제 시점을 파악할 수 없음
▪ RunTime 시점에 계속 추적하는 추가 리소스가 필요하여 성능저하 발생될 수 있음
▪ 순환 참조가 발생 시 영구적으로 메모리가 해제되지 않을 수 있음

 

'TIL (Today I Learned)' 카테고리의 다른 글

[Swift] MVVM 패턴  (0) 2024.02.17
[CS] 동기(Sync), 비동기(Async)  (1) 2024.02.16
[CS] 객체지향 프로그래밍(OOP)이란?  (0) 2024.02.12
[Swift] Swift란?  (0) 2024.02.12
[CS] 메모리 구조  (1) 2024.02.10