ARC

Judy·2022년 6월 2일
0

iOS

목록 보기
11/28

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

profile
iOS Developer

0개의 댓글