Heap&Stack in iOS

장수빈·2025년 6월 17일

CS

목록 보기
9/14

iOS에서의 메모리 구조와 관리 방식

메모리 영역설명
코드 영역 (Text Segment)실행 가능한 바이너리 코드 저장
데이터 영역 (Data/BSS)전역 변수 및 static 변수 저장
힙 (Heap)동적으로 할당된 메모리 (예: class, Array, String)
스택 (Stack)지역 변수, 함수 호출 스택 프레임 저장
메모리 매핑 영역 (Memory Mapped)프레임워크, dylib 등이 매핑됨

iOS는 ARC(Automatic Reference Counting)을 통해 메모리를 관리

  • 객체의 참조 카운트(reference count)를 기반으로, 0이되면 자동으로 메모리 해제
  • 강한참조(Strong), 약한참조(weak), 비소유 참조(Unowned) 등으로 순환 참조 방지

힙과 스택의 차이점

항목스택 (Stack)힙 (Heap)
할당 방식컴파일 타임런타임
접근 속도빠름 (선입후출)느림 (포인터 기반)
할당 대상지역 변수, 함수 호출 정보객체 인스턴스 (클래스 등)
관리 주체시스템(OS)개발자/런타임 (ex. ARC)
수명함수 종료 시 자동 해제명시적으로 해제 필요 (ARC 등)
메모리 크기상대적으로 작음

함수 호출 시 스택 메모리는 어떻게 사용되나?

함수 호출시 Stack Frame이 생성됨

  • 매개변수(parameter)
  • 지역변수(local variable)
  • 반환 주소(return address)
  • 이전 프레임의 base pointer

ex)

func greet() {
	let name = "subok" // stack에 저장
	print(name)
}
  • name은 greet() 호출 시 스택에 올라가고, 함수가 끝나면 자동 해제

재귀 함수 호출 시에는 스택 메모리는 어떻게 사용되나?

  • 재귀 호출 시 매 호출마다 새로운 스택 프레임이 할당
  • 깊은 재귀는 Stack Overflow를 유발할 수 있음

Stack Overflow는 어떤 경우에 발생?
스택 메모리 초과 사용시 발생하며, 주로 다음과 같은 경우 발생
너무 깊은 재귀 호출
무한 재귀
너무 큰 지역 변수 선언


Swift에서 값 타입, 참조 타입은 어디에 할당?

타입예시주로 할당 위치이유
값 타입(Value Type)struct, enum스택 또는 작은 struct는 스택, 큰 struct는 힙 (최적화에 따라 다름)
참조 타입(Reference Type)class, closure참조를 공유해야 하기 때문

값 타입과 참조 타입의 복사 방식

값 타입

  • 복사(Copy)시 새로운 메모리 공간 생성
  • Swift는 Copy-on-Write(COW)를 사용하여 성능 최적화

ex)

var a = [1, 2, 3]
var b = a // b는 a를 공유함 (복사 X)
b.append(4) // 이때 진짜 복사 발생 (COW)

참조 타입

  • 복사해도 참조만 복사(주소 공유)
  • 한 인스턴스를 여러 객체가 참조 가능

요약

질문핵심 요약
메모리 구조코드, 데이터, 힙, 스택, 메모리 매핑 영역
힙 vs 스택힙: 참조 타입, 느림 / 스택: 값 타입(일반적), 빠름
함수 호출 시 스택스택 프레임 생성 → 지역 변수 저장
재귀 시 스택호출마다 프레임 누적 → Stack Overflow 위험
값/참조 타입 메모리값: 주로 스택, 참조: 힙
복사 방식값 타입은 COW, 참조는 포인터 공유
Stack Overflow깊은 재귀, 큰 지역 변수 등으로 발생
profile
iOS 공부 이모저모 낙서장

0개의 댓글