-
ARC(Automatic Reference Counting)iOS 2021. 12. 20. 20:18
안녕하세요.
오늘은 ARC에 대해서 알아보도록 하겠습니다.
저는 그동안 자동으로 메모리를 관리해주는 방식으로만 알고 있었는데요.
이건 ARC를 알고 있다고 말할 수 없자나요?
그래서 오늘은 과연 ARC가 무엇인지 좀 더 자세히 알아보도록 하겠습니다.
ARC는 클래스의 인스턴스에만 적용됩니다.
값 타입과 달리 참조타입은 여러 곳에서 접근이 가능하기에 언제 메모리에서 해제되는지 중요합니다.
ARC 더 이상 참조되지 않는 인스턴스를 메모리에서 해제합니다.
다른 프로그래밍 언어를 사용하신 분들은 비슷한 존재를 아실 것 같은데요.
바로 GC(Garbage Collection)입니다.
GC도 자동으로 메모리를 관리해주는데요.
우선 ARC와 GC를 비교해보겠습니다.
ARC와 GC의 비교
ARC와 GC의 가장 큰 차이는 바로 참조 카운팅 시점입니다.
GC는 프로그램 실행 중에 동적으로 메모리를 감시합니다.
반면에 ARC는 놀랍게도 컴파일 시점에 메모리에서 해제되는 시점을 결정합니다.
두 개의 방식이 모두 장단점이 있는데요.
GC의 경우에는 Garbage Collector가 계속해서 메모리를 감시하고 있기 때문에 성능 저하가 발생할 수 있겠죠?
또 정확히 어느 시점에 인스턴스가 메모리에서 해제되는지 예측하기가 어렵습니다.
그러나 계속해서 메모리를 감시하기 때문에 인스턴스가 해제될 가능성이 더 높습니다.
반면에 ARC는 컴파일 시점에 인스턴스 해제 시점이 결정되어 있어 성능 저하는 발생하지 않습니다.
또한 개발자가 메모리에서 해제되는 시점을 알 수 있습니다.
하지만 순환참조가 발생한다면 영원히 인스턴스가 메모리에서 해제되지 않을 가능성이 존재합니다.
애플은 이런 둘 중에서 ARC를 선택했습니다.
성능을 택한 것이겠지요?
그런데 과연 ARC는 미래를 예측하는 것도 아니고 어떻게 컴파일 시점에 언제 메모리가 해제되는지를 결정할 수 있을까요?
원래 Objective-C에서는 왼쪽과 같이 수동으로 retain/release 코드를 작성해야 했습니다.
그러나 Swift에서는 오른쪽과 같이 ARC가 자동으로 컴파일 타임에 적절한 위치에 retain/release 코드를 삽입합니다.
referenceCount는 retain시 1이 증가하고 release시에는 1이 감소합니다.
인스턴스가 새로 생성되거나 다른 변수가 인스턴스를 참조하면 retain 되고
인스턴스를 가르키던 참조가 사라지면 release됩니다.
referenceCount가 0이 될 시 메모리에서 해제됩니다.
오늘은 ARC에 대해서 알아보았는데요.
혹시 잘못된 점이 있으면 알려주시면 감사하겠습니다.
'iOS' 카테고리의 다른 글
Storyboard VS Code(Programmatically) (0) 2021.12.21 Hugging & Compression Resistance (0) 2021.12.21 ViewController Life Cycle (0) 2021.12.16 View (0) 2021.12.15 Delegate Pattern (0) 2021.12.14