내일배움캠프 7기 Day81 TIL

Daisy Kim·2023년 11월 6일
0

얼마간만에 하는 블로그 포스팅인지 감개가 무량하다. 그동안 너무 소홀했던 것 같아 반성하며 매일같이는 아니더라도 뜨믐뜨믐 공부한 것을 적어내려가려 한다.

오늘은 기술면접대비를 하며 질문중 ARC란 개념을 접했다.

ARC? 먹는건가? 🙄

우선 검색부터 해보자...

🧃 ARC(Automatic Reference Counting)

앱의 메모리 사용량을 추적하여 자동적으로 관리하는 iOS의 메모리 기법으로
Reference Count(참조 횟수)를 계산하여 참조 횟수가 0이면 더이상 사용하지 않는 메모리로 판단하여 해제

🍎 ARC의 동작방식

① 인스턴스 생성시 해당 인스턴스에 대한 메모리를 할당
강한 참조(strong reference)를 통해, 현재 사용중인 인스턴스의 메모리 할당을 유지
현재 인스턴스를 참조하는 속성, 상수, 변수의 count를 추적 ⇒ count가 하나 이상 존재하는 한, 인스턴스를 할당 해제하지 않는 것

참조 계산 시점에 따른 메모리 관리방법 비교

🍏 GC(Garbage Collection) vs RC(Reference Counting)의 차이점

1. GC

  • 계산시점: Run time(동적 감시)
  • 장점: ① 인스턴스가 해제될 확률이 높다, ② 특별한 규칙을 신경쓰지 않아도 된다
  • 단점: ① 런타임시 참조를 계속 추적하므로 추가 리소스 사용 및 성능저하 발생 가능성 , ② 개발자가 메모리 해제시점을 예측하기 어려움

2. RC

  • 계산시점: Compile time
  • 장점: ① 컴파일시 메모리 해제시점 결정으로 개발자가 대략적 해제시점을 예측가능, ②런타임에 메모리 해제를 위한 추가 리소스가 발생하지 않음
  • 단점: ① 기본적인 규칙과 동작방식에 대한 이해 필요, ② 순환참조 등 메모리 누수의 위험성

🍎 RC(Reference Count)란 무엇인가

현재 해당 인스턴스의 참조 유무를 숫자로 표현한 것

🍏 RC가 숫자를 세는 두가지 기준

1. Count Up(+ 1):

  • 인스턴스의 주소값을 변수에 할당할 때
  • 인스턴스를 생성 ⇒ 새로운 변수 대입
  • 기존 인스턴스를 다른 변수에 대입

2. Count Down(- 1):

  • 인스턴스를 가리키던 변수가 메모리에서 해제되었을 때

  • nil이 지정되었을 때

  • 변수에 다른 값을 대입한 경우

  • 프로퍼티의 경우 속해 있는 클래스 인스턴스가 메모리에서 해제될 때

    🐛 지금의 Swift가 아닌 Objective-C 언어를 사용하던 과거에는 수동(Manual)으로 참조 횟수를 계산하는 MRC(또는 MRR)를 사용했다고 한다.

🍎 메모리 누수(Memory Leak)와 강한참조 순환(Retain Cycle)

두 개의 객체가 서로가 서로를 참조하고 있는 상태로 영구적으로 메모리가 해제되지 않을 가능성이 있다.

🍏 해결방법 ①: Weak Reference(약한 참조)

  • 약한 참조는 강한 참조와 달리, 인스턴스의 참조 횟수를 증가시키지 않는다.

🍏 해결방법 ②: Unowned Reference(미소유 참조)

  • 미소유 참조 또한 참조 횟수를 증가시키지 않는 방법이다.
    이 둘의 가장 큰 차이점은 미소유 참조시에는 참조하는 인스턴스가 메모리에 반드시 존재할 것이라는 전제를 기반으로 한다는 점!

🐛 약한 참조는 인스턴스가 메모리에서 해제되었을 경우 자동으로 nil 을 할당해주기 때문에 무.조.건 옵셔널 변수로 선언 해야 하고, 미소유참조는 옵셔널 변수로 선언하지 않아도 된다.

공식문서
참고블로그1
참고블로그2

profile
Technology proderit homini

0개의 댓글