본문 바로가기

iOS (스파르타)/Swift 문법

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

07. ARC와 메모리 누수

 

1) ARC(Automatic Reference Counting)

  • Swift의 ARC(Automatic Reference Counting)는 메모리 관리 기법 중 하나로, 객체나 인스턴스가 참조되는 횟수를 추적하여 메모리에서 해제할 시점을 결정합니다. 객체가 생성될 때마다 참조 횟수가 1 증가하고, 해당 객체를 참조하는 다른 객체나 변수가 없어지거나 더 이상 사용되지 않을 때 참조 횟수가 1 감소합니다. 참조 횟수가 0이 되면 해당 객체는 메모리에서 해제됩니다.
  • ARC의 작동 방식
    1. 객체 생성: 객체가 생성되면 참조 횟수가 1 증가합니다.
    2. 객체 참조: 객체를 다른 변수나 상수에 할당하면 해당 객체의 참조 횟수가 1 증가합니다.
    3. 참조 해제: 객체의 참조가 없어지면(참조하는 변수나 상수가 없거나 **nil**이 할당되면) 참조 횟수가 1 감소합니다.
    4. Zeroing Weak References: 약한 참조(Weak Reference)는 객체의 참조 횟수를 증가시키지 않고 추적합니다. 객체가 해제되면 약한 참조는 자동으로 **nil**로 설정됩니다.

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

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

 

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

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