ARC에 대해서 설명해보세요.

French Marigold·2023년 6월 20일
0

면접 준비

목록 보기
6/9

ARC란 무엇일까?

ARC란 힙 영역에서 동작하는 클래스나 클로저 등의 메모리를 관리해주는 방법으로 해당 인스턴스를 가리키는 객체의 숫자를 세는 방식으로 메모리를 관리합니다.
이를 Reference Counting이라고 합니다.
만일 해당 인스턴스를 가리키는 객체가 없다면 Reference Counting이 0이 되고 이 때 비로소 힙 영역에서 메모리가 해제됩니다.


순환 참조의 문제

힙 영역의 메모리를 관리하다보면 Retain Cycle(순환 참조)의 문제가 발생할 수 있습니다.
순환참조란 힙 영역의 인스턴스끼리 서로의 RC 값을 올려서 RC 값이 힙 영역에 계속 남아있어 인스턴스가 더 이상 메모리에서 해제될 수 없는 상황을 말합니다.
이러한 순환 참조를 해결할 수 있는 방법은 다음과 같습니다.

1) Weak
1-1) 가리키고 있는 객체 앞에 weak이라고 적습니다. 그렇게 되면 그 객체는 인스턴스의 RC 값을 올리지 않습니다.
1-2) weak는 객체를 "옵셔널" 로 참조하기 때문에 참조하는 객체가 도중에 사라질 가능성이 있을 때 사용합니다.
1-3) 소유자(변수)에 비해 짧은 생명주기를 가진 인스턴스를 참조할 때 주로 사용 -> 인스턴스가 사라져도 변수에 자동으로 nil이 할당되어 안전하기 때문
⭐️ (인스턴스 수명 < 소유자 (변수) 수명) ⭐️
1-4) weak는 힙 영역에 존재하는 타입만 받을 수 있습니다 (클래스, 클로저 타입만 받을 수 있습니다) ⭐️⭐️
(String, Int, Double 이런 타입은 받을 수 없습니다)

2) unowned
2-1) 가리키고 있는 객체 앞에 unowned라고 적습니다. unowned도 마찬가지로 인스턴스의 RC 값을 올리지 않습니다.
2-2) unowned는 객체를 "일반 타입" 으로 참조하기 때문에 참조하는 객체가 항상 존재함을 가정합니다.
2-3) 소유자(변수)보다 인스턴스의 생명주기가 더 길거나, 같은 경우에 사용
-> 인스턴스의 생명주기가 더 짧으면 변수 내에 값이 없게 되며,
unowned 같은 경우 일반 타입으로 참조하기 때문에 nil 값이 자동으로 할당되지 않으므로 에러가 발생합니다. 그러므로 반드시 인스턴스의 생명주기가 더 길거나, 소유자(변수)와 같아야 합니다.
⭐️ (인스턴스 수명 >= 소유자 (변수) 수명) ⭐️ -> 인스턴스가 먼저 사라지면 변수에 아무런 값도 존재하지 않기에 에러가 발생하므로 반드시 인스턴스 수명이 변수(소유자) 수명보다 더 길거나 같아야 합니다.
2-4) unowned는 힙 영역에 존재하는 타입만 받을 수 있습니다 (클래스 혹은 클로저 타입만 받을 수 있습니다) ⭐️⭐️
(String, Int, Double 이런 타입은 받을 수 없습니다)

profile
꽃말 == 반드시 오고야 말 행복

0개의 댓글