GC vs. ARC
ARC는 가비지컬렉션이 절대 아니다!
혼동하면 안됩니다. 방식 자체가 둘이 완전히 다르거든요.
Objective C는 기본적으로 Reference Counting 이라는 메모리 관리 모델을 사용합니다. Objecitve C에서만 사용되는 방법은 아니지만 어쨌든 Objective C에서는 기본적으로 메모리를 관리하는 방법
그런데, 이 역시도 어떤면에서든 수동으로 메모리를 관리하는 것이 기본이다보니 프로그래머가 사람인 이상 실수할 때도 있더라는 겁니다.
그래서인지 애플은 XCode 4.2와 iOS 4.3부터 ARC (Automatic Reference Counting) 이라는 메모리 관리 기능을 추가
이로써 프로그래머들이 직접 메모리를 release 하지 않아도 되게 됨
오히려, ARC 기능이 추가되면서, 애플은 맥에서 지원되던 가비지 컬렉션조차 없애버렸음.
가비지 컬렉션 방식은, 메모리 관리를 가비지 컬렉터라는 것이 프로그램 실행중에 동적으로 감시하고 있다가, 더이상 사용할 필요가 없다고 여겨지는 것을 메모리에서 삭제해 주는 것입니다. 즉, 실행타임에서 메모리 관리를 하는 것입니다.
그와는 달리, ARC는 프로그램이 실행되고 있는 상태에서 감시하는 것이 아니라, 코드를 빌드할 때에(컴파일할 때) 컴파일러가 프로그래머 대신에 release 코드를 적절한 위치에 넣어주는 것입니다.
즉, 프로그래머가 코딩할 때에 release 코드를 넣지 않았다 뿐이지, 실제로 기계어로 번역된 바이너리에는 컴파일러가 프로그래머 대신 넣어준 release 코드가 존재 한다는 의미입니다.
이 차이점을 이해하는 것이 중요한데, ARC라는 것이 이런식으로 동작한다는 것을 알고 있어야, 효율적인 프로그램을 짤 수 있게 되기 때문입니다.
예를 들어, 어디에 메모리를 할당하는 코드를 위치할 것인지, 또는 어디서 해제가 되었으면 좋겠다라든지 이런것을 예상할 수 있어야 한다는 것이지요. 예를 들어 어느부분에서 할당한 메모리가 더이상 필요 없을때에, nil 값을 넣어주는 코드를 넣는다면, 컴파일러는 그 전에 release 코드를 넣어준다든가 하는 방식으로 말이죠.
사실 일반적인 부분은 그렇게 어렵지 않습니다. 다만 골치 아플때가 있는 것이, Objective C 코드는 ARC를 사용할 수 있는데 반해, 기존의 C/C++ 코드는 수동으로 메모리 관리를 하기 때문에 서로 같이 사용할때는 주의가 필요함.
출처: https://wingsnote.com/32 [날개의 노트 (Wing's Note)]