메모리 구조
- 앱이 실행되면 운영체제(iOS)가 메모리에 영역을 설정

- 메모리 영역 4가지 -
Code / Data / Heap / Stack
Code
- 작성한 코드가 컴파일된 기계어 상태(ex. 101001...)로 저장되는 공간
- CPU가 해당 영역의 코드를 읽고 작업 수행
- 프로그램 실행시 메모리 할당되고 종료시 메모리 해제
- 실행중에는
Read-Only로 변경 불가
Data
- 전역변수와 정적변수(Static)가 저장되는 공간
- 프로그램 실행시 메모리 할당되고 종료시 메모리 해제
- 프로그램 실행 중 변수 값 변경이 될 수 있어
Read-Write
Heap
- class인스턴스 또는 클로저 같은
참조타입이 할당되는 동적 메모리 공간
- 메모리 크기는 런타임 중 결정됨.
ARC에 의해 자동으로 메모리 관리가 되지만 개발자는 메모리 누수에 주의❗️
Stack
- 함수 호출시 생성되는 지역변수, 매개변수, 리턴값이 저장되는 공간
- 일반적으로
값 타입 저장
- 함수 종료시 메모리 해제
- 컴파일 시점에 메모리 크기 결정
스택 오버플로 : 스택 메모리 크기가 제한되어 초과할 경우 프로그램 종료됨
Value Type 🆚 Reference Type
-
Value 타입
- 데이터가
Stack에 저장되는 경우가 많음. 메모리 접근 빠름
- 원본 값을 변하지 않기 때문에 멀티스레드 환경에서 안전
-
Reference 타입
- 실제 데이터가
Heap영역에 저장
- 하나의 인스턴스에 대한 여러 참조자가 있을 수 있음
ARC에 의해 자동으로 메모리 관리
참조카운팅에 의해 메모리 해제 시점 결정
💡 Copy On Write
- 메모리 효율을 위해
Value 타입의 인스턴스를 값 할당 또는 변경 전까지는 실제로 복사하지 않는 것
