정보/레벨 0

iOS 앱의 메모리 구조와 관리 방식

밤새는 탐험가89 2024. 7. 23. 21:42

iOS 앱의 메모리 구조와 관리 방식

iOS의 메모리 구조는 크게 네 가지 영역으로 나눌 수 있습니다

힙(Heap) 영역, 스택(Stack) 영역, 코드(Code) 영역, 데이터(Data) 영역이고, 각 영역은 고유의 특징과 관리 방식이 있습니다.

1. 힙(Heap) 영역

1.1 특징

  • 힙 영역은 동적으로 할당된 메모리를 저장하는 곳입니다. 객체(Object), 클래스 인스턴스, 동적으로 생성된 데이터 등이 이 영역에 할당됩니다.
  • 메모리 크기는 고정되어 있지 않고, 필요에 따라 증가하거나 감소할 수 있습니다.
  • 개발자가 명시적으로 메모리를 할당하고 해제해야 하며, 주로 malloc, free 같은 함수나 Objective-C와 Swift에서 제공하는 메모리 관리 방법을 사용합니다.

1.2 관리 방식

  • iOS에서는 ARC(Automatic Reference Counting)로 메모리를 관리합니다.
    • ARC: ARC는 객체의 생명주기를 관리하기 위해 객체에 대한 참조(reference) 횟수를 카운트합니다. 객체가 생성되면 참조 카운트가 1이 되고, 다른 객체가 해당 객체를 참조하면 참조 카운트가 증가합니다. 참조가 더 이상 없으면 참조 카운트가 0이 되어 객체가 메모리에서 해제됩니다.
    • 강한 참조(strong reference): 기본적으로 모든 참조는 강한 참조입니다. 강한 참조는 참조 카운트를 증가시킵니다. 예를 들어, var a = Object()와 같이 선언된 변수는 강한 참조를 가집니다.
    • 약한 참조(weak reference): 약한 참조는 참조 카운트를 증가시키지 않습니다. 이는 순환 참조를 방지하기 위해 사용됩니다. 예를 들어, weak var b: Object?와 같이 선언된 변수는 약한 참조를 가집니다.
    • 무주기 참조(unowned reference): unowned 키워드를 사용하여 강한 참조와 비슷하지만, 참조하는 객체가 해제된 후에도 참조를 유지하려는 경우 사용됩니다. 이는 참조 대상이 항상 존재한다고 가정할 때 유용합니다.

2. 스택(Stack) 영역

2.1 특징

  • 스택 영역은 함수 호출 시 할당되는 메모리 공간입니다. 함수의 매개변수, 반환 주소, 로컬 변수 등이 저장됩니다.
  • 메모리 할당 및 해제는 LIFO(Last In First Out) 방식으로 이루어집니다.

2.2 관리 방식

  • 스택 메모리는 자동으로 할당 및 해제됩니다. 함수가 호출되면 스택 프레임이 생성되어 해당 함수의 로컬 변수가 저장되고, 함수가 종료되면 스택 프레임이 파괴됩니다.
    • 스택 프레임: 함수가 호출되면 해당 함수의 스택 프레임이 스택에 쌓입니다. 스택 프레임에는 함수의 매개변수, 로컬 변수, 반환 주소 등이 포함됩니다.
    • 로컬 변수: 함수 내에서 선언된 로컬 변수는 해당 함수의 스택 프레임에 저장됩니다. 이는 함수가 호출될 때 자동으로 할당되고, 함수가 종료되면 자동으로 해제됩니다.

2.3 함수 호출 예제

  • exampleFunction이 호출되면, 스택에 exampleFunction의 스택 프레임이 생성됩니다.
  • localVariable이 스택 프레임에 저장됩니다.
  • 함수가 종료되면 exampleFunction의 스택 프레임이 제거되고, localVariable도 함께 해제됩니다.

3. 코드(Code) 영역

3.1 특징

  • 코드 영역은 실행 파일의 코드(명령어)가 저장되는 영역입니다.
  • 프로그램이 시작될 때 메모리에 로드되며, 읽기 전용입니다.
  • 프로그램의 실행 중에 수정되지 않습니다.

3.2 관리 방식

  • 운영체제에 의해 관리됩니다. 실행 파일이 로드될 때 필요한 코드가 메모리에 적재됩니다.
  • 읽기 전용으로 설정되어 있어 코드 수정이 불가능하며, 이는 보안과 안정성을 높이는 역할을 합니다.

4. 데이터(Data) 영역

4.1 특징

  • 데이터 영역은 전역 변수와 정적 변수 등이 저장되는 공간입니다.
  • 프로그램이 시작될 때 할당되며, 프로그램이 종료될 때까지 유지됩니다.
  • 초기화된 데이터와 초기화되지 않은 데이터 영역으로 나뉩니다.
    • 초기화된 데이터: 초기값이 있는 전역 변수와 정적 변수가 저장됩니다.
    • 초기화되지 않은 데이터: 초기값이 없는 전역 변수와 정적 변수가 저장됩니다.

4.2 관리 방식

  • 프로그램이 시작될 때 데이터 영역에 전역 변수와 정적 변수가 할당됩니다.
  • 프로그램이 종료될 때까지 해당 변수들은 메모리에 유지되며, 프로그램 종료 시 해제됩니다.

메모리 할당과 관리의 종합

iOS에서 메모리 관리는 ARC를 통해 효율적으로 이루어집니다. ARC는 객체의 참조 카운트를 자동으로 관리하여 메모리 해제를 자동화하고, 스택과 힙을 포함한 다양한 메모리 영역의 효율적인 사용을 돕습니다. 개발자는 이러한 메모리 구조와 관리 방식을 이해하고 최적화된 메모리 관리를 통해 앱의 성능과 안정성을 높일 수 있습니다.