swift를 공부하면서 ARC라는 것을 배우게 되었다.
옛날에 JAVA를 공부할 때 GC와 비슷한 개념인 것 같아서 두 개를 비교해서 정리해보려고 한다.
JAVA로 개발하면 GC가 알아서 메모리 관리를 해주기 때문에 순환 참조 같은 문제는 고려할 필요가 없다. 그러나, iOS를 하다보면 순환 참조 문제를 반드시 겪게 된다. 그렇다면 GC랑 ARC가 뭐가 다르길래 순환 참조 문제를 해결할 수 없는 걸까?객체의 라이프 사이클 관리가 나오기 이전에는 개발자가 직접 모든 객체의 생명주기를 직접 신경써야 했다. 객체가 필요할 때 생성하고, 다 이용하면 명시적으로 메모리에서 해제(release)해 주어야 했던 것이다. 이것은 코드가 복잡해 질 뿐만 아니라 객체 구조를 유지하기 힘들게 만든다.
GC나 ARC는 모두 개발자의 짐을 덜어주는 데에 목적이 있다. GC나 ARC의 탄생으로 더 이상 참조 카운트를 추적하지 않아도 되었다. 또한, 소유권을 신경쓰지 않아도 되었다. 결과적으로 사용되지 않는 객체를 수동으로 메모리에서 해제 하는 것에 대해 걱정할 필요가 없어진 것이다.-GC란 이미 할당된 메모리에서 더 이상 사용하지 않는 메모리를 해제하는 기술을 말한다. Java에서 사용되고 있는 객체 생명주기 관리 기술이다.
GC는 runtime에 동작하는데, 백그라운드에서 사용되지 않는 객체 및 객체 그래프를 관리한다. GC는 불확실한 간격으로 발생하므로(특정시간이 경과한 후, 혹은 런타임에 사용가능한 메모리가 줄어드는 경우), 객체가 더이상 사용되지 않는 정확한 순간에 반드시 해제 되는 것은 아니다.
GC가 발생하는 경우, application의 다른 스레드가 일시적으로 멈 출 수 있다.ARC란 개발자가 기존에 수동으로 개발자가 직접 retain/release를 통해 reference counting을 관리해야하는 부분을 자동으로 관리해는 기술을 말한다.
ARC는 GC와 다른 접근 방식을 취한다. 런타임에 백그라운드에서 사용하지 않는 객체를 찾아 처리하는 대신, 컴파일러가 객체의 참조 회수를 추적하고, 필요에 따라 자동으로 객체를 release하는 코드를 실행 파일에 주입한다.
alive상태를 유지하는 현상을 말한다.GC는 reachable객체를 살펴 보며 작동한다. 외부 참조가 존재하지 않는 것을 감지하면, 서로를 참조하는 객체 그래프 전체를 버린다. 때문에, 순환 참조문제가 발생하지 않는다.
ARC는 더 낮은 수준에서 작동하고, 참조 수를 기반으로 생명 주기를 관리하기 때문에 retain cycle을 자동으로 처리할 수 없으며, 결과적으로 메모리 누수 문제를 일으킨다.
ARC는 retain cycle을 피하는 방법을 제공 하지만, 개발자의 명시적인 설계가 필요하다. 이를 위해 ARC는 strong, week, unowned와 같은 Storage Modifier를 도입한 것이다.