Swift 문법 심화-ARC와 메모리 누수

유민우·2024년 6월 18일
0

ARC 와 메모리 누수

ARC (Automatic Counting)

Swift의 ARC는 메모리 관리 기법 중 하나로, 객체나 인스턴스가 참조되는 횟수를 추적하여 메모리에서 해제할 시점을 결정합니다. 객체가 생성될 때마다 참조 횟수가 1 증가하고, 해당객체를 참조하는 다른 객체나 변수가 없어지거나 더이상 사용되지 않을 때 참조 횟수가 1 감소 합니다.
참조 횟수가 0이 되면 해당 객체는 메모리에서 해제 됩니다.

ARC의 작동 방식

  1. 객체 생성: 객체가 생성되면 참조횟수가 1 증가합니다.
  2. 객체 참조: 객체를 다른 변수나 상수에 할당하면 해당 객체의 참조횟수가 1 증가합니다.
  3. 참조 해제: 객체의 참조가 없어지면(참조하는 변수나 상수가 없거나 nil이 할당되면) 참조횟수가 1 감소합니다.
  4. Zeroing Weak References: 약한참조(Weak Reference)는 객체의 참조횟수를 증가시키지 않고 추적합니다. 객체가 해제되면 약한 참조는 자동으로 nil로 설정됩니다.

참조횟수 증가 예시

강한 참조 순환(Strong Reference Cycle) 문제와 해결방법

  • Swift로 개발할 때에는 메모리 누수를 주의 해야합니다.
  • 참조는 디폴트로 강한참조를 사용하는데, 이 강한참조를 잘못 사용하면 메모리 누수 문제가 발생할 수 있습니다.
  • 가장 대표적인 예가 두개 이상의 인스턴스가 서로를 강하게 참조 할 때 발생합니다.
    이 문제를 강한참조순환 이라고 합니다.
    *강한참조순환: 메모리가 해제되지 않고 유지되어 메모리 누수가 발생하는 현상

강한참조순환의 예시

강한참조순환 문제 해결 방법

  1. 약한 참조(Weak Reference): 참조되는 대상을 약하게 참조하여 강한순환참조를 방지합니다.
  • weak는 옵셔널로 선언되는 참조입니다.
  • 약한 참조는 객체를 강제로 유지하지 않고, 참조대상이 메모리에서 해제되면 자동으로 nil로 설정됩니다.
  • 주로 순환참조를 방지하기 위해 사용됩니다. 두 객체가 서로 강하게 참조하는 경우, 순환참조로 인해 메모리 누수가 발생할 수 있습니다. 이런상황에서는 한쪽을 weak로 선언하여 순환참조 문제를 해결할 수 있습니다.
  1. 비소유 참조(unowned Reference): 참조되는 대상이 항상 유효한 경우에만 사용하며, 해당대상이 해제될 수 있는 상황에는 사용하지 않습니다.
  • unowed은 옵셔널이 아닌 비소유 참조를 나타냅니다.
  • 비소유 참조는 항상 값이 있다고 가정하며, 참조하는 객체가 해제되면 런타임 에러가 발생할 수 있습니다.
  • unowned 참조는 참조 대상이 해제될 수 있는 경우에만 사용해야 합니다. 그리고 그 객체가 메모리에서 해제되지 않은 상태에서만 해당 unowned 참조를 사용해야 합니다.

약한 참조를 사용한 해결방법

비소유 참조를 사용한 해결방법

profile
유민우

0개의 댓글