iOS의 메모리 구조
iOS의 메모리 구조는 크게 4가지 영역으로 구분됩니다.
1. 코드 영역(Code Segment)
코드 영역은 앱의 실행파일에 포함된 상수 데이터가 저장되는 영역입니다. 읽기 전용으로, 앱이 실행될 때 메모리에 로드 되어 사용됩니다.
2. 데이터 영역(Data Segment)
데이터 영역은 앱의 전역 변수와 정적 변수가 저장되는 영역입니다. 읽기/쓰기가 가능하며 앱이 실행될 때 메모리에 로드되어 사용됩니다.
3. 스택 영역(Stack Segment)
스택 영역은 함수 호출 시 생성되는 지역변수와 매개변수가 저장되는 영역입니다. LIFO 방식으로 동작하며 함수 호출이 끝나면 해당 함수에서 사용한 메모리가 자동으로 해제됩니다.
4. 힙 영역(Heap Segment)
힙 영역은 앱에서 동적으로 할당되는 메모리가 저장되는 영역입니다. 이 영역은 스택 영역과 달리 크기가 동적으로 변할 수 있으며, 개발자가 직접 할당하고해제 해야합니다. 이 때 효율적인 메모리 관리를 위해 ARC를 사용합니다.
설명
ARC(Auto Reference Counting)은 iOS에서 메모리를 관리하는 도구 중 하나입니다. iOS5에서 처음 도입되었으며, ARC를 사용하면 개발자가 직접 메모리를 할당하거나 해제하지 않아도 객체가 필요하지 않을 때 자동으로 메모리에서 해제됩니다.
작동 방식
- 컴파일러가 자동으로 객체의 참조 계수를 추적하고 객체를 참조하는 변수나 프로퍼티가 더 이상 필요하지 않을 때 자동으로 참조 계수를 감소시킵니다.
- 참조 계수가 0이 되면 객체는 자동으로 메모리에서 해제됩니다.
장단점
장점
- 개발자가 메모리를 수동으로 관리하지 않아도 됩니다.
- 객체의 참조 계수를 추적하고, 필요하지 않은 객체를 자동으로 해제함으로서 메모리 누수의 방지가 가능합니다.
단점
- ARC가 자동으로 메모리를 관리하기 때문에 객체가 언제 해제될지 예측하기 어렵습니다.
- ARC가 객체의 참조 계수를 추적하기 때문에 객체를 참조할 때마다 참조 계수를 증가시켜야 하는데, 이 때문에 런타임 오버헤드가 발생할 수 있습니다.
참조 순환
- 참조 순환이란, 서로를 참조하는 객체들이 메모리에 계속 유지되는 상황을 말합니다.
- 이런 상황에서는 ARC가 객체를 해제하지 못하기 때문에 참조 순환의 문제가 발생합니다.
- 이러한 참조 순환의 문제를 방지하기 위해서는 weak 참조나 unowned 참조를 사용해야 합니다. weak, unowned 참조를 사용하면 참조하는 객체의 참조 계수를 증가시키지 않습니다.
- weak 참조는 객체가 메모리에서 해제될 가능성이 있는 경우에 사용하며, unowned 참조는 객체가 메모리에서 해제될 가능성이 없는 경우에 사용됩니다.
- 객체가 메모리에서 해제된다면 weak 참조는 nil값으로 설정되며, unowned 참조는 더 이상 유효하지 않게 됩니다.
ARC를 제외하고 iOS에서 메모리를 관리하는 방법
수동 메모리 관리(manual memory management)
- 개발자가 직접 객체를 할당하고 해제하는 방식입니다.
- 개발자가 메모리 관리를 직접해야하는 부담이 있으며 메모리 누수의 문제가 발생하기 쉽습니다.
- 객체의 생명주기를 제어할 수 있으며 참조 순환에 대한 대처가 쉬워집니다.