티스토리 뷰

반응형

 


Automatic Reference Counting (ARC) 자동 참조 카운팅

스위프트는 Automatic Reference Counting (ARC)를 사용해서 앱 내 메모리 사용을 추적하고 관리합니다. 대부분의 상황에서 이는 swift 내에서 자동으로 메모리관리를 해주는 것을 의미합니다. 그리고 개발자가 메모리 관리에 대해서 고민할 필요가 없게 해줍니다. ARC는 자동적으로 클래스 인스턴스가 더이상 필요하지 않을 경우, 이를 자동적으로 해제 해줍니다.

그러나, 몇몇 케이스에서는 메모리 관리를 위해 ARC에서는 코드 부분들 사이의 관계에 대해 더 많은 정보를 요구할 수 있습니다. 이번 챕터에서는 이러한 상황들을 묘사하고, 앱 내 모든 메모리 관리를위해 어떻게 ARC를 활성화 할 수 있는지 보여줍니다. swift에서의 ARC 사용은 Objective-C 내 ARC사용에 대한 Transitioning to ARC Release Notes 에 설명된 접근과 매우 유사합니다.

Reference Counting은 클래스 인스턴스에서만 적용됩니다. Structure(구조체), Enumerations(열거형)은 값 타입이며 참조타입이 아니기 때문에 참조에 의해 저장되고 전달되지 않으므로 ARC의 영향을 받지 않습니다.

 


How ARC Works, 어떻게 ARC가 작동하는가

매번 새로운 Class 인스턴스를 생성할때마다, ARC는 해당 인스턴스의 정보를 적재하기 위해 메모리의 chunk(덩어리)를 할당합니다. 이 메모리는 인스턴스 타입에 대한 정보를 해당 인스턴스와 관련되어 저장된 프로퍼티들의 값을 함께 포함하여 유지합니다.

추가적으로, 인스턴스가 더이상 필요하지 않게 될 때, ARC는 해당 인스턴스에 의해 사용되는 메모리를 해제하고, 해제 된 해당 메모리는 다른 목적을 위해 사용될 수 있게 됩니다. 이는 클래스 인스턴스들이 더이상 필요하지 않게 될 때 메모리를 차지하지 않도록 보장해줍니다.

그러나, 만약 ARC가 여전히 사용중인 클래스 인스턴스 메모리를 해제하게 된다면, 해당 인스턴스의 프로퍼티들에 더이상 접근하지 못하게 되거나, 인스턴스의 메서드를 호출하지 못할 수 있습니다. 실제로, 만약 이미 해제 된 클래스 인스턴스에 접근시도를 할 경우, 높은 확률로 앱이 크래시를 일으킬 가능성이 있습니다.

필요한 인스턴스들이 사라지지 않도록 하는 것을 보장하기 위해서 ARC는 현재 각각의 인스턴스들에 대해 얼마나 많은 프로퍼티, 상수, 변수들이 참조하고 있는지를 추적합니다. ARC는 인스턴스들이 여전히 존재할 수 있도록 최소한 한개의 활성 참조가 있는 한 인스턴스를 해제하지 않을 것입니다.

이러한 것들이 가능하도록, 당신이 클래스 인스턴스에 프로퍼티, 상수, 변수를 할당할 때마다, 이러한 프로퍼티, 상수, 변수들은 인스턴스에 strong 참조를 생성합니다. 이때의 참조를 강한참조(strong refernce) 라고 하는데, 강한참조는 인스턴스를 강하게 잡고 유지하며, 최소한 한개이상의 강한참조가 남아있는 한, 그 동안에는 인스턴스가 해제되는것을 허용하지 않기 때문입니다.

 


ARC in Action 작동중인 ARC

아래 코드는 ARC가 어떻게 작동하는 지의 한 예입니다. 이 예시는 Person 이라는 간단한 클래스로 시작합니다. Person 클래스는 name: String의 상수를 정의하고 있습니다.



Person 클래스는 인스턴스의 name 프로퍼티를 설정하고, 해당 인스턴스가 초기화 됨을 가리키는 메세지를 출력합니다. Person 클래스는 소멸자 또한 갖고 있으며, 소멸자 실행시에도 클래스 인스턴스가 해제됨을 가리키는 메세지를 출력합니다.

아래 인용된 다음 코드들은 Person? 타입의 변수들을 정의하고 있으며, 이들은 이후 나올 코드의 새로운 Person 인스턴스를 위한 다수의 참조를 설정하기 위해 사용될 것입니다.



당신은 이제 새로운 Person 클래스 인스턴스를 생성할 수 있고, 위의 세 변수 중 하나의 변수에 할당할 수 있습니다.


Person 클래스의 생성자를 호출하는 시점에, "John Appleseed is being initialized"가 출력
되며, 이는 인스턴스 생성이 되었음을 확인시켜줍니다.

새로운 Person 인스턴스가 reference1 변수에 할당되어 졌기 때문에, reference1은 새로운 Person 인스턴스에 대한 강한 참조가 생깁니다. 최소한 하나의 강한 참조가 있으므로, ARC는 해당 Person 인스턴스가 메모리에 유지되고, 메모리에서 해제되지 않도록 보장합니다.

만약 동일한 Person 인스턴스를 2개의 변수에 추가 할당한 다면, 해당 인스턴스에 대한 두개의 강한참조가 추가로 생성됩니다.


이제 하나의 Person 인스턴스에 대한 총 3개의 강한 참조가 존재합니다.

만약 3개의 강한 참조 중 두개의 강한 참조를 없애기 위해 두개의 참조변수에 nil을 할당한다면, 여전히 1개의 강한참조가 남게 되고, 최소 1개의 참조가 남아있으므로, Person 인스턴스는 메모리에서 해제되지 않습니다.


ARC는 Person 인스턴스에 대한 마지막 1개의 강한참조가 깨지기 전까지, Person 인스턴스를 더이상 사용하지 않게 될 명확한 시점까지는 해당 인스턴스를 메모리에서 해제하지 않습니다.


여러 인스턴스 간에 강한참조 (strong reference) 를 사용할 때 발생할 수 있는 문제
가 있습니다.

바로 Strong Reference Cycles (강한 참조 순환) 문제인데요. 다음 포스팅에서 이어서 다뤄보겠습니다. 

많은 의견 환영합니다. 감사합니다 ^-^//

 

참고 문서 링크 ▼

Swift Automatic Reference Counting

 

 

반응형
댓글
반응형
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/05   »
1 2 3 4
5 6 7 8 9 10 11
12 13 14 15 16 17 18
19 20 21 22 23 24 25
26 27 28 29 30 31
글 보관함