leeyang의 개발 성장기
메모리구조 본문
안녕하세요 리양입니다 🙂
너무 오랜만에 글을 쓰느라 어떤 글을 쓸까 고민을 하다. 블로그 글을 적는 이유가 제가 스스로 정리하기 위한 일이기도 해서 메모리 구조를 적어볼까 합니다.
메모리 구조를 알아야 메모리 해제 관련 등을 이해하기 쉽지 않을까 해서요!
iOS 프로그램을 실행하게 되면 메모리 구조는 아래 그림과 같습니다
Code
작성한 소스코드가 0,1의 binary 형태로 저장되는 공간입니다! 그래서 텍스트 영역이라고 불리기도 합니다. 기계어 형태로 저장되어 있으며 컴파일 타임에 결정이 되고 코드가 변경되면 안되기 때문에 Read-Only 형태로 저장됩니다.
즉 Code 영역에 핵심은 binary, 기계어, Read-Only
Data 영역
말그래도 데이터 영역입니다. 전역변수, static(정적) 변수가 저장이 되지요
프로그램 시작과 함께 할당되면서 프로그램 종료가 되면 소멸합니다.
값이 변하기 떄문에 당연히 Read-Write입니다.
Heap 영역
프로그래머가 직접 할당(malloc) / 해제(calloc) 하는 메모리 영역입니다. 사용하고 난 후에는 반드시 메모리 해제를 해줘야 하고, 해제를 하지 않으면 memory leak이 발생하게 됩니다.
그리고 유일하게 런타임 시에 결정되는 영역이기 떄문에 데이터 크기가 확실하지 않을 때 사용합니다.
Heap은 프로그래머가 직접 메모리 관리해야하지만 스위프트는 직접 하지 않고 ARC를 통해서 자동으로 해제해줍니다.
스위프트는 어떤 값이 힙에 할당될까요? 바로, 클래스 인스턴스, 클로저 같은 참조 타입의 값은 힙에 자동 할당됩니다.
Stack 영역
함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등이 저장되고 함수가 종료되면 저장된 메모리도 해제가 됩니다. 컴파일 타임에 결정되기 때문에 무한히 할당 할 순 없습니다. 즉 자동으로 사용하는 임시 메모리 영역인거지요.
각 영역의 특징들을 알아보았습니다.
heap과 stack이 왠지 대조적으로 보이면서 비슷하지 않나요?
그 이유는 같은 메모리 영역을 공유하고 있기 때문입니다! 같은 공간의 메모리 영역을 공유하면서 데이터 크기를 모르거나 스택에 저장하기엔 큰 데이터는 힙에 할당, 그외는 스택에 할당되는 상부상조(?) 같은 느낌인거죠.
그래서 다시 정리하면 힙 영역은 낮은 메모리 주소부터 할당을 받고
스택은 높은 메모리 주소부터 할당을 받게 됩니다 🙂
이 부분의 다음은 ARC가 기대가 되네요 금방 돌아오겠습니다^_^
참조
'iOS' 카테고리의 다른 글
[iOS] 코드사이닝: 인증서, 프로비저닝을 만들어봅시다. (0) | 2020.04.30 |
---|---|
MVC, MVVM, MVP, VIPER, VIP를 알아봅시다. (0) | 2020.02.28 |
[iOS] iOS13 다크모드 대응! (0) | 2019.10.15 |