ARC란 무엇인지 설명하시오.
Opened this issue · 6 comments
ARC 는 Automatic Reference Counting 의 약자로, 앱의 메모리 사용을 추적하고 관리해주는 기능을 합니다.
클래스가 새로운 인스턴스를 할당하게 되면 ARC 는 인스턴스 정보를 저장할 메모리를 할당하고 참조 카운트를 증가시킵니다. 그 후 인스턴스의 참조가 해제되면 참조카운트를 감소시키고 더이상 필요하지 않은 상태가 되면 참조카운트가 0이 되어 자동으로 메모리에서 해제가 됩니다.
ARC에서는 두개의 클래스 인스턴스가 서로를 참조하는 경우에는 강한 순환참조가 일어나서 영원히 메모리에서 해제되지 않는 문제가 발생하기도 합니다. 이를 해결하기 위한 방법으로는 weak, unowned 참조가 있습니다.
ARC는 Automatic Reference counting의 줄임말로 참조 메모리 관리를 자동으로 해주는 기능입니다.
인스턴스가 참조될때 count가 증가하고 참조 해제될때 count가 감소되어 count가 0이면 인스턴스를 메모리에서 해제시킵니다.
Garbage Collection과 다르게 컴파일 타임에만 실행되어 리소스를 낭비하지 않는다는 특징이 있습니다.
strong으로 인스턴스를 참조할때 count가 증가하고 weak, unowned로 참조할때는 count가 증가하지 않습니다.
따라서 순환 참조를 해결하기 위해 weak, unowned 참조를 사용합니다.
ARC, Automatic Reference Counting은 이름 그대로 참조횟수를 자동으로 관리해주는 역할을 수행합니다. 인스턴스의 주소값이 변수에 할당되면 참조횟수가 증가하고, 인스턴스 주소값을 가리키던 변수가 메모리에서 해제되면 참조횟수가 감소합니다. 이 때 참조횟수가 0이 될 경우 메모리에서 해제합니다.
실행기간동안 주기적으로 참조를 추적해 해제하는 GC와는 다르게 Complie Time에 언제 참조되고 해제되는지 미리 결정되어 런타임때 그대로 처리된다는 특징이 있습니다.
다만 ARC는 두 객체가 서로를 참조할 경우 순환참조가 발생하면서 변수가 메모리에서 해제되지 않을 위험이 있습니다. 이를 해결하기 위해 weak, unowned 로 서로간의 참조를 약하게 만들기도 합니다.
ARC란 Automatic Reference Counting의 약자로 자동으로 메모리를 관리해주는 기법입니다. 인스턴스가 참조되거나 해제될 때를 카운팅하여 참조 횟수가 0이 되면 메모리 해제하는 방식으로 주로 참조 타입인 클래스에 적용됩니다.
만약 두개의 클래스가 서로를 참조하게 되면 메모리가 해제 되지 않는 누수 상황이 발생할 수 있는데, weak나 unowned 키워드를 사용해 레퍼런스 카운트가 증가되지 않게 하여 이를 방지할 수 있습니다.
ARC는 프로그램 실행 중 동적으로 메모리를 관리해주는 Garbage Collection과 다르게 컴파일 타임에만 실행이 되어 리소스를 낭비하지 않고, 개발자가 직접 코드를 작성하지 않아도 자동으로 메모리 관리를 해준다는 장점이 있습니다.
unowned은
인스턴스를 참조하는 도중에 해당 인스턴스가 메모리에서 사라질 일이 없다고 확신
따라서 참조하던 인스턴스가 만약 메모리에서 해제된 경우,
nil을 할당받지 못하고 해제된 메모리 주소값을 계속 들고 있음
unowned으로 선언된 변수가 가리키던 인스턴스가 메모리에서 먼저 해제된 경우,
접근하려 하면 에러를 발생시킴
weak은 옵셔널 바인딩을 해줘야 함
-
ARC: Automatic Reference Counting
- Objc와 Swift에서 메모리 관리를 위해 Clang 컴파일러가 제공하는 기능
- 컴파일 시 retain과 release를 삽입하여 런타임에 reference count를 올리거나 내리고, 참조 수가 0이 될 때 객체 할당을 해제
-
ARC 에서 발생할 수 있는 문제
- 순환 참조
-
순환 참조를 해결하기 위한 방법
- reference count 계산에 포함되지 않는 unowned or weak을 사용한다
- 메모리에 없는 객체를 참조하게 되면 unowned는 crash가 나고, weak는 nil을 반환한다
- 하지만, 약한 참조를 사용하여 객체의 수명이 종료되는 동안 수명에 의존하고 있기에, 미래에 버그가 나타날 수 있음
-
weak와 unowned 참조를 안전하게 처리하는 방법
- Optional Binding
- withExtendedLifetime()
- 강한 참조 접근으로 재설계
- 내부 클래스 정보에 가시성을 제한하도록 재설계
-
Xcode 13에서 제공하는 ARC 기능
- build setting -> Swift Compiler -> Optimiza Object Lifetimes
- 객체의 수명을 보장된 최소 수명에 가깝게 만들어 줌