iOS의 메모리 구조와 관리 방식에 대해 알아보려한다.
프로그램이 실행되면 OS가 메모리 공간을 할당해주는데 Code, Data, Heap, Stack 4개로 나뉜다.

우리가 작성한 소스코드가 저장되는 영역이다.
컴파일 타임에 결정된다.Read-Only로 저장된다프로그램 어디서든 사용될 가능성이 있는 전역변수와 static변수가 저장된다.
컴파일 타임에 결정된다.시작과 동시에 할당되며 프로그램이 종료되어야 메모리가 해제된다.Read-Write로 저장된다.데이터 크기가 확실하지 않은 가변적인 데이터 타입들이(런타임 시 결정되기 때문에 데이터크기가 확실하지않음) 저장되는 영역이다. 클래스 인스턴스나 클로저 등 참조 타입들이 주로 할당되지만, 값타입도 할당은 가능하다.
런타임에 결정된다.메모리 크기에 대한 제한이 없다. 그래서 “자유 저장 영역” 혹은 “동적 메모리 영역”이라 불린다.범위가 전역이기 떄문에, 프로그램의 모든 함수에서 엑세스 할 수 있다.스레드들이 공유하는 영역이기 때문에,힙 경합(두 개 이상의 쓰레드가 동시에 접근하려 할 때)이 발생할 수 있다. → 속도 저하 유발, thread-safety X메모리를 직접 관리해야한다. 메모리 해제를 해주지 않으면 메모리 누수가 발생한다. → Swift의 경우 ARC를 통해 자동으로 해제를 관리해준다.함수의 호출과 관련된 지역변수,매개변수,리턴 값들이 저장되는 영역이다.
컴파일 타임에 결정된다.후입선출 LIFO(Last In,First Out)방식으로 동작한다.CPU에서 관리하고 최적화 하기 때문에 속도가 매우 빠르다.함수가 종료되면 메모리도 자동으로 해제된다.메모리 크기에 제한이 있다.지역 변수만 액세스 가능하다.Stack은 메모리가 한정되어 있기 때문에 너무 큰 메모리는 할당할 수 없다.
데이터의 크기를 모르거나, Stack에 저장하기엔 큰 데이터의 경우엔 Heap에 할당 하고 그 외엔 Stack에 할당하면 된다. (인스턴스, 클로저 등 자동으로 Heap에 할당되는 것 외에 직접 할당할 경우) 만약 Stack에 너무 많은
메모리를 할당하게 되면 Stack overflow가 발생한다.
Stack overflow?
스택에 너무 많은 메모리를 할당하게 되어 자신의 스택 영역을 초과한 경우,
iOS에서 Stack over flow 발생 시 앱이 crash된다.
변수는 Stack에 저장되고, 그 변수는 Heap의 주소 값을 갖는다.
클래스 인스턴스를 Heap에 저장하려면 어디에 저장할지 찾아야 하고 멀티 스레드 환경에서 Locking, 해제과정 등 시간이 소요되기 때문에 클래스를 사용하는것은 Stack에 저장되는 구조체를 사용하는 것보다 오래 걸린다.
클래스와 구조체 두개 다 사용 가능한 경우, 구조체를 사용하는것을 권장하고 상속이나 참조와 같은 클래스만의 기능을 사용해야 할 경우 클래스를 이용한다.

Heap과 Stack 같은 메모리 영역을 공유한다.
같은 메모리 공간에서 힙 영역은 낮은 메모리 주소부터 할당받고,
스택 영역은 높은 메모리 주소부터 할당 받는 것이다.
따라서 힙 또한 자신의 영역 외로 확장하려다 보면 Heap overflow가 발생한다.