[swift] ARC 자동 참조 카운팅

코르피·2022년 9월 16일
0

ARC

ARC란?

Automatic Reference Counting
자동 참조 카운팅의 뜻을 가지고 있다.

앱의 메모리 사용을 추적해서 관리하는 일을 한다.
"just works" 하는 거라 메모리 관리를 직접 할 필요는 없다. 인스턴스를 다 써서 필요없을 때 자동으로 해제해준다.

참조 카운팅은 클래스 인스턴스에만 적용한다. 구조체와 열거체는 값 타입이라서 참조로 저장하지 않는다.

어떻게 동작하지?

클래스 인스턴스를 생성하는 순간 ARC가 인스턴스에 대한 정보를 저장하는 공간을 함께 할당한다.

인스턴스에 몇개의 프로퍼티, 상수, 변수등이 참조하고 있는지 추적해서 카운팅 한다.
여기서 참조하는 카운팅을 증가시키는 경우는 "강한 참조" 일 경우인데 적어도 하나의 강한 참조가 활동중이라면 인스턴스를 해제하지 않는다.

클래스 인스턴스 사이의 강한 순환 참조


예를들어
john이 가리키는 Person 인스턴스에서 Unit4A를 가리키고
Unit4A가 가리키는 Apartment 인스턴스에서 john을 가리키는 상황이다.
서로 강한 참조를 통해서 카운팅을 늘려주어

Person인스턴스는 john, Apartment인스턴스에서 가리키니 rc = 2
Apartment인스턴스는 unit4A, Person인스턴스에서 가리키니 rc = 2 가 된다.

만약 위 상황에서 john, unit4A의 연결을 끊으면 어떻게 될까?

john = nil
unit4A = nil

이런 상황이어도 Person인스턴스와 Apartment 인스턴스는 해제되지 않는다. 왜냐하면 서로 강한 참조로 카운팅이 증가해있기 때문이다.
메모리상 어딘가에서 유령처럼 떠다니고 있을 것이다.
만약 이런 상황이 100개 1000개가 된다면 메모리가 부족해지고 앱이 느려지거나 최악의 경우 앱이 터지는 경우가 생길 수 있다.

강한 순환참조를 푸는 법

그럴 경우 weak 키워드를 사용한다.
weak 키워드를 사용하는 경우 rc가 증가하지 않는다
Person인스턴스의 경우 rc = 1
Apartment인스턴의 경우 rc = 2 가 된다.

이 상황에서

john = nil

을 해 줄 경우 Person 인스턴스는 rc = 0 이 되어 아무도 가리키지 않고 있기 때문에 자동으로 해제된다.
그럼과 동시에 Apartment 인스턴스의 rc 도 하나 줄어들어서 rc = 1이 된다.

unit4A = nil

여기서 마저 unit4A도 nil로 연결을 끊는다면
Apartment의 인스턴스 rc = 0 이 되어서 자동으로 해제된다.

느낀점

나만 모르더라 ARC 🥲
여기까지만 해도 어려우므로 unowned는 이후에..

profile
행복합시다!!

0개의 댓글