메모리의 구조
Q. 컴퓨터의 주기억장치는 어떤어떤 영역을 가지고 있을까?
- 스택, 힙, 데이터, 코드 영역이 있다
- 스택은 지역변수, 리턴값, 매개변수 등이 저장되고, 메모리의 높은 주소에서 낮은 주소로 할당된다. 이게 다른 메모리 영역을 침범하면 스택 오버플로우 발생
- 힙은 사용자(프로그래머)가 직접 관리하는 메모리 영역. malloc, dealloc 등을 통해 관리할 수 있다. 낮은 주소에서 높은 주소로 할당되며, 침범시 힙 오버플로우 발생
- 데이터와 코드 영역은 파일의 크기에 영향을 끼친다. 힙 밑에 로드된다. 데이터 영역은 프로그램의 정적 변수와 전역 변수 등이 저장된다. 코드 영역은 프로그램의 코드가 저장된다.
ARC
Q : ARC는 무엇인가?
- Auto Reference Count
- 메모리 영역 중 힙 영역을 관리한다.
- 인스턴스에서 사용하는 메모리를 해제하여 메모리를 다른 용도로 사용할 수 있도록 한다.
- ARC가 사용 중인 인스턴스의 할당을 해제하는 경우 해당 인스턴스의 속성에 액세스하거나 해당 인스턴스의 메서드를 호출할 수 없다.
- 이를 가능하게 하려면 속성, 상수, 변수에 클래스 인스턴스를 할당할 때마다 강력한 참조를 만들어주면 된다.
ARC 이전의 메모리 관리는 어땠을까?
- iOS의 경우, Objective-C 시절 MRR(Manual Reference Control)을 사용했다.
- 공식 문서에서는 MRR(Manual Retain Release)라는 표현이 나온다.
- retain, release, autorelease 등을 통해 수동으로 메모리를 관리했다.
ARC를 이해해야 하는 이유는 무엇무엇이 있을까?
- 주로, 강한 참조와 연관이 있을 것으로 생각이 된다.
- 강한 참조를 이야기하기 전에, 먼저 ARC가 사용중인 변수를 임의판단해서 메모리에서 해제해 버리면? 크래쉬가 날 것이다.
- 이를 방지하기 위해 ARC는 어떤 것들이 해당 변수를 참조하고 있는지 항상 주시한다. 그렇게 함으로써 마지막 하나가 해당
- 변수의 참조를 끝낼 때까지 해당 변수를 들고 있는다.
- 이것이 강한 참조.
- 그런데, 클래스끼리 서로의 강한 참조를 들고 있으면 강한 순환 참조가 발생해 버린다. 참조되고 있는 값의 참조 카운트가 1 밑으로 떨어지지 않는 것…
언제 구조체를 선택하고 언제 클래스를 선택해야할까?