본문 바로가기
iOS/iOS

ARC (Automatic Reference Counting)

by 헤콩 2020. 12. 22.
반응형

iOS 개발을 공부하면서 꼭 알아야할 것 중 하나인 ARC (Automatic Reference Counting). 도대체 ARC가 뭘까요?

먼저, 앱의 성능을 유지하기 위해서는 메모리 관리가 필수적입니다.

Stack 메모리에 저장된 데이터는 자동으로 제거되기 때문에 특별한 관리가 필요 없지만, Heap 메모리는 개발자가 동적으로 할당하는 메모리 공간이기 때문에 Heap 메모리에 저장된 데이터는 필요하지 않은 시점에 직접 제거해야만 합니다. 따라서 메모리 관리 모델은 Heap에 저장된 데이터를 관리합니다.

[ 참고 ]

Value Type은 Stack 메모리에, Reference Type은 Heap 메모리에 저장됩니다.

Value Type: Structure, Enumeration, Tuple..

Reference Type: Class, Closure..

 

애플에서 제공하는 어플리케이션 개발 환경인 Cocoa / Cocoa Touch 에서는 메모리 관리 모델이 2가지 있습니다.

지금은 잘 사용되지 않는 MRC와 많이 쓰이고 있는 ARC입니다.

MRC와 ARC

MRC (Manual Reference Counting)Objective-C로 개발하던 iOS 개발 초창기 시절에 사용했던 메모리 관리 모델입니다. 이 때에는 인스턴스의 기본 메소드인 retain과 release를 호출하면서 개발자가 직접 메모리 관리하는 코드를 작성해야했습니다. 그렇기 때문에 코드의 양도 많아지고, 메모리 오류 가능성도 높아져 프로그램의 안정성이 낮아질 수밖에 없었습니다.

 

하지만 WWDC 2011에 발표된 ARC (Automatic Reference Counting)를 사용하기 시작하면서, 컴파일러가 알아서 메모리 관리 코드를 삽입하여 코드의 양은 적어지고 프로그램의 안정성을 높일 수 있게 되었습니다. ARC가 등장하면서부터 거의 모든 프로젝트는 ARC를 사용하기 시작했습니다. Objective-C는 MRC와 ARC 모두 사용 가능 했지만 Swfit는 ARC만 사용가능했고, 점점 Swift로 개발하는 시대가 되었기 때문입니다.

 

 

그렇다면 ARC가 컴파일 타임에 실행되는데, 어떻게 동적으로 실행되는 것들의 Reference Count를 세고 메모리 관리를 할 수 있을까요?

ARC컴파일 타임에 자동으로 retain, release를 적절한 위치에 삽입하는 방식으로 메모리를 관리합니다. Heap 영역에 Reference형 자료들이 얼마나 참조되고 있는지 카운팅하고, 이 Reference Count를 통해서 참조 카운트가 0이 될 때, deinit을 통해 해제시키게 됩니다.

메모리 관리 프로세스

ARC는 활성화된 참조카운트가 하나라도 있을 경우 메모리에서 해제되지 않는데, 이 때문에 영원히 메모리에서 해제되지 않는 경우를 만들지 않기 위해서 메모리 참조 순환에 대해서도 알아야 합니다.

이전 게시물 중에메모리 참조 순환에 대한 게시물이 있으니 참고하시면 좋을 것 같습니다.

 

 

ARCGC의 가장 큰 차이점은?

GC (Garbage Collection) 방식은, 메모리 관리를 Garbage Collector가 프로그램 실행 중에 동적으로 감시하고 있다가, 더이상 사용할 필요가 없다고 여겨지는 것을 메모리에서 해제시킵니다. 즉, 메모리 관리가 런타임 시에 이루어집니다.

하지만 ARC컴파일타임에 자동으로 구문을 분석해서 적절하게 retain/release 코드를 삽입해주어 실행중에 별도의 메모리 관리가 이루어 지지 않습니다.

 

 

 

 

 

 

[iOS] ARC 란? (Automatic Reference Counting)

앱의 성능을 유지하기 위해서는 메모리 관리가 기본이자 필수적 입니다. 그렇기 때문에 코코아(Cocoa)에서 사용하는 메모리 관리모델을 이해할 필요가 있습니다. 바로 MRC와 ARC 2가지 관리 모델입

onelife2live.tistory.com

 

[Swift] ARC 뿌시기

ARC.. 들어는 봤습니다만?ㅎ

sujinnaljin.medium.com

 

 

[iOS Swift] RC, ARC 와 MRC 란? 그리고 Strong, Weak, Unowned 는? 간단하게 적어봤습니다.

요즘에도 MRC 기반으로 개발 하는 곳이 있을 지 궁금하군요.

medium.com

 

반응형

'iOS > iOS' 카테고리의 다른 글

키체인 (Key Chain)  (0) 2021.04.13
GCD (Grand Central Dispatch)  (0) 2021.03.23
XCTest tips and tricks that can level up your Swift testing  (0) 2021.03.03
Frame과 Bounds  (0) 2021.02.26
Data Binding in MVVM on iOS  (2) 2021.01.07

댓글