[Swift] ARC (Automatic Reference Counting)

Bibi·2022년 1월 19일

[Swift] ARC (Automatic Reference Counting)

https://babbab2.tistory.com/26

메모리 구조 간단 정리

  • Text (Code) : 컴파일된 소스코드 저장
  • Data : 전역변수, static 변수 저장
  • Heap : 참조 타입 저장 - 클래스 인스턴스, 클로저
  • Stack : 함수의 지역변수, 매개변수, 리턴값 저장

[Swift] 참조 타입 선언 시 힙과 스택의 동작

스위프트는 참조 타입(인스턴스, 클로저 등)을 선언할 때 자동으로 힙에 할당한다.

우리가 지역변수로 클래스 인스턴스를 만들면...

let rice = Food(name: "rice")

  • 힙 : name = riceFood 인스턴스가 할당됨
  • 스택 : 지역변수 rice가 할당되며, 힙에 할당된 인스턴스를 참조함(인스턴스의 주솟값을 저장)

ARC란?

ARC는 메모리구조 중 힙(heap) 영역에 할당된 메모리를 관리한다.

  • 힙 영역은 사용 후 반드시 메모리 해제를 해 주어야 하며, 그렇지 않으면 메모리 누수가 발생한다.

  • 스위프트에서는 ARC가 불필요한 인스턴스를 메모리에서 자동으로 해제해 준다.

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")
  • 기존 인스턴스를 다른 변수에 대입할 때
    • let rice2 = rice

RC 계산 - 감소하는 시점

  • 인스턴스를 가리키던 변수가 메모리에서 해제되었을 때
  • (옵셔널) nil이 할당되었을 때
  • 변수에 다른 값을 대입
  • (프로퍼티의 경우) 프로퍼티의 클래스 인스턴스가 메모리에서 해제될 때
    • 프로퍼티가 같이 해제되는 것이 아닌, RC가 1 감소하는 것이다.

0개의 댓글