
인스턴스를 현재 누가 가르키고 있느냐 없느냐(참조하냐 안하냐)를 숫자로 표현한 것.
참조 계산 시점: Complie Time에 언제 참조되고 해제되는지 결정되어 런타임 때 그대로 실행된다.
ARC(Auto Reference Counting)은 iOS에서 앱의 메모리 사용을 자동으로 추적하고 관리해주는 도구이다. Objective-C에서는 retain, release, autorelease 등을 통해 MRC(Manual Reference Counting), 즉, 수동으로 메모리를 관리했다.
retain : retain count(= reference count) 증가를 통해 현재 Scope에서 객체가 유지되는것을 보장release : retain count(= reference count)를 감소시킴. retain 후에 필요 없을 때 release 함.ARC는 기존에 수동으로 메모리 관리하던 것을 compile time에 자동으로 retain, release를 적절한 위치에 삽입하는 방식으로 메모리 관리를 쉽게 바꿔주었다.
Reference Count(참조 횟수)를 계산하여 참조횟수가 0이면 더 이상 사용하지 않는 메모리라 생각하여 해제한다.
기본적으로 클래스의 객체를 가리키는 각각의 reference는 강한 참조이다. 최소한 하나의 강한 참조가 있는 한 이 객체의 메모리는 해제되지 않는다. 만일 객체에 대한 강한 참조가 존재하지 않는다면 메모리에서 해제된다.
ARC의 원리는 제대로 작동을 하고 대부분의 경우 메모리에 대해서 개발자가 생각할 필요가 없다. 그러나 이러한 ARC가 작동하지 않는 상황이 몇몇 있으며 우리는 그런 상황을 생각해봐야 한다.
대표적인 예시는 순환 참조로 두 개의 객체가 서로가 서로를 참조하고 있는 형태를 말한다.
순환 참조가 발생 시 영구적으로 메모리가 해제되지 않을 수 있다.
그러나 strong으로 선언된 변수들이 순환 참조가 됐을 시 문제점은 서로가 서로를 참조하고 있으면 RC가 0이 되지 못한다는 점이다. 이렇게 강한 참조를 사용하여 순환 참조에 문제가 생긴 경우를 ‘강한 순환 참조’라고 한다.
이런 경우를 메모리 누수(Memory Leak)라고 한다. 메모리 누수를 방지하기 위해 고안된 방법이 “연결 상태를 strong, weak, unowned으로 각각 상황에 따라서 약하게 연결할지 강하게 연결할지 결정하자!” 라는 것인데, 이것이 바로 Retain Cycle이라고 말할 수 있겠다.
iOS 앱에 이러한 메모리 누수가 많으면 메모리 사용량이 증가할 것이고, 결국엔 앱을 죽인다. 이것이 Retain Cycle을 잘 다뤄야 하는 이유이다. 이러한 메모리 누수를 피하려면 weak키워드로 피할 수 있다.