iOS/Swift(스위프트)

[Swift] Swift의 메모리관리에 대해서 알아보자! ARC란? (Automatic Reference counting)

기록하는 동구 2023. 3. 6. 20:00
반응형

안녕하세요! 오늘은 Swift의 ARC(자동 참조 계수)에 대해 알아보도록 하겠습니다.

 

 

ARC란?

ARC(자동 참조 계수)는 Swift의 메모리 관리 방식 중 하나로, 객체의 참조 횟수를 추적하여 객체의 생성과 소멸을 관리하는 시스템입니다.

 

- 참조 횟수?

 

객체의 참조 횟수는 해당 객체를 참조하는 변수나 상수의 개수를 나타냅니다.

객체를 참조하는 변수나 상수가 생성될 때마다 해당 객체의 참조 횟수가 1 증가합니다.

 

- 객체의 생성과 소멸?

 

Swift에서 객체를 생성하면 객체에 대한 메모리 공간이 할당되고, 해당 객체의 참조 횟수는 1 증가합니다.

객체를 참조하는 변수나 상수가 소멸될 때마다 해당 객체의 참조 횟수가 1 감소합니다.

이후에 참조 횟수가 0이 되면 해당 객체는 더 이상 필요하지 않은 객체로 판단되어 메모리에서 자동으로 해제됩니다.

 

객체 생성 -> 객체에대한 메모리공간 할당 -> 해당 객체 참조 횟수 +1

 

ARC는 어떤 장점과 어떤 단점이 있을까? (ARC 장단점)

 

- ARC의 자동 메모리 관리

 

Swift에서는 ARC를 기본적으로 지원하며, 개발자는 메모리 관리와 관련된 작업을 수동으로 처리할 필요가 없습니다.

스위프트 컴파일러는 코드를 분석하여 참조 횟수를 추적하고, 필요하지 않은 객체를 자동으로 메모리에서 해제합니다.

 

- ARC의 한계와 해결 방법

 

ARC도 완벽한 메모리 관리를 보장하지는 않습니다. 약한 참조(weak reference)미소유 참조(unowned reference)를 사용하지 않고 코드를 작성할 경우, 강한 순환 참조(strong reference cycle)가 발생하여 메모리 누수(memory leak)가 발생할 수 있습니다. 이러한 경우에는 ARC를 수동으로 제어하여 메모리 누수를 방지해야 합니다.

 

- 약한참조(weak reference) 와 미소유 참조(unowned reference) 의 차이점

 

약한 참조(Weak Reference)

  • 약한 참조는 참조하는 객체에 대한 참조 관계를 유지하지만, 해당 객체의 참조 횟수를 증가시키지 않습니다.
  • 약한 참조는 참조하던 객체가 메모리에서 해제되었을 경우, 자동으로 nil로 초기화됩니다.
  • 일반적으로 참조하려는 객체가 Optional 타입이 아닐 때 사용됩니다.

미소유 참조(Unowned Reference)

  • 미소유 참조는 약한 참조와 비슷하지만, 참조하는 객체가 메모리에서 해제된 후에도 nil로 초기화되지 않습니다.
  • 따라서 미소유 참조는 참조하려는 객체가 Optional 타입이 아닐 때 사용되고, 해당 객체가 메모리에서 해제된 후에도 참조하려는 객체가 존재할 것으로 가정합니다.
  • 만약 미소유 참조를 사용하여 참조하려는 객체가 이미 메모리에서 해제되었다면, 런타임 오류가 발생할 수 있습니다.

 

 

이상으로 Swift의 ARC에 대해 간략히 알아보았습니다.

ARC는 Swift의 핵심 개념 중 하나이므로, 개발자는 ARC에 대한 이해가 필수적입니다.

필요에 따라서 약한 참조나 미소유 참조와 같은 기술을 적절하게 활용하여 안정적인 애플리케이션을 개발할 수 있도록 노력해야 합니다.

 

 

 

참고

https://tdcian.tistory.com/290

 

[Swift] weak와 unowned의 차이

요즘 RxSwift 습득에 열을 올리는 중입니다! RxSwift로 구성된 코드를 보다 보면 weak self나 unowned self 코드를 보게 되는 경우가 많았습니다. 막연하게 강한 참조로 인해 발생하는 메모리 누수 문제를

tdcian.tistory.com

https://yudonlee.tistory.com/36

 

[Swift] weak, unowned 차이 - ARC 기초편 3탄

안녕하세요, 지난 포스팅에선 Strong Reference와 그로 인해 발생하는 Strong Reference Cycle을 해결하는 방법에 대해서 배웠습니다. 그때 순환참조를 해결하기 위해서, 직접 참조를 nil로 지정해 Reference Co

yudonlee.tistory.com

 

반응형