RAM 메모리 영역
1. 코드 영역
- 소스 코드가 기계어 형태(0과 1로만 이뤄짐)로 저장
- 컴파일 타임에 결정
- 코드가 중간에 변경되지 않도록 Read-Only 형태로 저장
2. 데이터 영역
- 전역 변수, static 변수가 저장
- 프로그램 시작과 동시에 할당
- 프로그램이 종료되면 메모리 해제
- 실행 도중 값이 변경가능하니 Read-Write로 저장
3. 힙 영역
- 프로그래머가 할당/해제
- malloc, calloc으로 동적 할당 가능
- 반드시 메모리 해제를 해야 함(그렇지 않으면 memory leak이 발생)
- 런타임 시에 결정
- 데이터 크기가 확실하지 않을 때 사용
- swift에선 클래스 인스턴스, 클로저 같은 참조 타입 값은 힘데 자동 할당됨
- swift에선 ARC를 통해 힙에 할당된 메모리가 더 이상 참조되지 않으면 자동으로 해제해줌
4. 스택 영역
- 함수 호출 시 함수의 지역변수, 매개변수, 리턴 값 등 저장
- 함수가 종료되면 저장된 메모리도 해제
- 컴파일 타임에 결정
- 무한히 할당 불가능
ARC
힙에 할당된 인스턴스의 메모리를 자동으로 해제하는 가능
동작
- 자동으로 참조 횟수를 관리하며 동작
- 새 인스턴스를 만들면 인스턴스 정보(+저장 프로퍼티)를 담는 메모리를 할당
- 더 이상 인스턴스가 사용되지 않을 때 메모리를 해제
- RC 증가
인스턴스의 주소값을 변수에 할당할 때
- RC 감소
인스턴스를 참조하고 있던 변수가 메모리에서 해제될 때
인스턴스를 참조하고 있던 변수에 nil이 부여될 때
인스턴스를 참조하고 있던 변수에 다른 값이 대입될 떼
프로퍼티의 경우, 속해 있는 클래스 인스턴스가 메모리에서 해제될 때
Strong Reference
- Reference Count + 1
- 서로가 서로를 참조하고 있는 경우 해제되지 않고 메모리 누수가 발생할 수 있음
- default는 강한 참조
Weak Reference
- 약한 참조로 선언하면 참조하고 있는 것이 먼저 메모리에서 해제
- 약한 참조 대상이 해제되면 참조하고 있는 변수에 nil을 할당
Unowned Reference
- 미소유 참조는 참조 대상이 되는 인스턴스가 현재 참조하는 것과 같거나 긴 생애주기를 가져 항상 참조에 그 값이 있다고 기대됨
- 미소유 참조에는 절대 nil을 할당하지 않는다(=옵셔널 타입을 사용하지 않는다)
구조체와 열거형은 값 타입으로 메모리 관리할 필요가 없음 -> 참조 횟수에 포함 x
메모리 구조
ARC
클래스와 구조체의 ARC