ARC는 클래스 인스턴스가 더 이상 필요하지 않을 때 메모리를 자동으로 해제함.
ARC는 Automatic Reference Counting의 약자로, Swift에서 메모리를 관리하는 방법이다.
Reference Counting이란 참조 숫자 카운팅으로 메모리를 관리한다는 의미이며, 런타임이 아닌 컴파일 타임에 실행되어 메모리 해제 시점을 결정한다. 여기에 Automatic이 붙었으니 이 작업을 자동으로 한다는 뜻이 되겠다.
즉 자동으로 레퍼런스 카운팅을 해서 그 카운팅한 숫자가 0이 되는 순간 메모리에서 해당 데이터를 없앤다고 생각하면 된다.
💡 주의!!
여기서 주의할 점은, ARC가 메모리를 완전히 자동으로 관리해준다는 의미가 아니다. 레퍼런스 카운팅 즉 숫자를 세는 일을 알아서 해 준다는 뜻이기 때문에, 정확히 알고 주의해야 한다.
제대로 사용하지 않으면 메모리 해제가 되지 않는 경우를 맞닥뜨릴 수 있다.
ARC : 힙에 할당된 인스턴스의 메모리를 자동으로 관리
메모리의 4가지 영역(코드, 스택, 데이터, 힙)중 힙 영역은 메모리 누수 현상의 위험이 존재하기에 개발자가 직접 관리해줘야 한다.
즉 ARC는 힙 영역을 관리하는 방법이라고 할 수 있다.
클래스의 인스턴스나 클로저 등의 참조 타입은 힙 영역에 동적으로 할당된다.
동적 할당이란, 인스턴스 호출시 힙 영역 내의 비어 있는 공간을 찾아서 메모리를 할당해준다는 의미이다.
이렇게 동적으로 할당된 메모리는 더 이상 해당 데이터가 필요없는 시점이 오면 반드시 해제해줘야 하는데, 여기서 ARC가 그 역할을 한다.
ARC는 메모리의 참조 횟수를 카운팅(Reference Counting)해서 참조 횟수가 0이 되면 메모리를 해제하는데, 이 때 주의할 점은 ARC만 믿고 손 놓고 있으면 안 된다.
자칫 잘못하면 강한 참조 사이클로 인해 해제되어야 할 메모리가 해제되지 않고 계속 남아있는 메모리 누수 현상이 생길 수 있기 때문이다.
이 강한 참조 사이클 문제를 해결하기 위한 방법으로는 weak와 unowned선언이 있는데, 이건 뒤에서 차차 알아보자.