[Swift] 메모리 관리 (ARC)

김영민·2022년 5월 23일
0

ARC와 메모리 관리

  • 객체를 생성한다는 것은 메모리를 사용한다는 것입니다.
  • 따라서, 메모리 공간에는 제약이 있으므로 관리해야 효율적으로 사용할 수 있습니다.

메모리 관리

  • 필요 없는 객체 해제
  • 필요한 객체 유지

객체가 사용하는가?

  • 사용중이라는 표시 : 소유하기 (Own)
  • 객체 소유하는 방법 : 강한 참조 (Strong Pointer)

객체 소유 관리

  • Reference Count
    : 강한 참조의 개수
    : 객체 사용 -> 카운트 늘리기
    : 객체 사용 끝 -> 카운트 감소

  • 수동 관리 / 자동 관리

ARC (자동 객체 카운트 관리)

  • Automatic Reference Counting
  • 레퍼런스 타입 객체에만 적용 (클래스)
  • 구조체, enum 객체에는 미적용

객체 소유와 해제

  • 객체 생성 = 객체 소유
  • nil 대입 = 객체 해제
  • 객체 해제 확인하기 - deinit

강한 참조

  • 객체를 소유하는 포인터
  • 소유권 해제가 객체의 해제는 아닙니다.
  • 다른 참조를 이용하여 소유합니다.

변수의 스코프와 소유권

  • 객체를 소유하는 참조 변수의 종류
    : 지역 변수
    : 프로퍼티
    : 타입 프로퍼티

  • 선언 방식에 따라 스코프가 다릅니다.

지역 변수

  • 함수 내에서 소유
  • 함수가 끝나면 소유권 해제

프로퍼티

  • 프로퍼티의 라이프 사이클 : 객체 생명 주기

타입 프로퍼티

  • 수동으로 객체 생존 주기 설정

콜렉션과 소유권

  • 콜렉션에 객체 저장 : 콜렉션이 객체 소유
  • 콜렉션에서 객체 삭제 : 소유권 해제
  • 콜렉션 삭제 : 소유권 해제

강한 순환 참조

  • 클래스끼리 서로서로 소유하고 있을 때 일어남
  • 서로 소유하므로 해제되지 않음 (메모리 누수)

약한 순환 참조

  • 객체를 소유하지 않는 약한 참조 사용
  • weak 사용
  • 참조하던 객체가 해제되면 자동으로 nil
  • 상호 독립적으로 존재하는 객체에 사용 권장. (운전자와 자동차, 사용자와 스마트폰)

unowned

  • 옵셔널 타입으로 선언 불가능
  • 완전히 종속적인 경우에 사용
  • 사용하던 객체가 해제되도 nil로 변하지 않음.
  • 단독으로 존재 못하는 경우에 사용 (신용카드와 사용자, 국가와 수도)

0개의 댓글