THIS IS ELLIE

Swift ARC에 대해서(1) 본문

개발/Swift

Swift ARC에 대해서(1)

Ellie Kim 2019. 4. 18. 22:52

ARC란 

스위프트의 ARC(Automatic Reference Counting)는 앱의 메모리 사용을 추적하고 관리합니다.

 

그렇기 때문에 따로 메모리를 어떻게 관리해야 하는지 생각할 필요가 없습니다. 

ARC는 클래스 인스턴스가 더 이상 필요하지 않을 때 클래스 인스턴스가 사용하는 메모리를 자동으로 비우기 때문입니다.

(하지만 몇 가지 부분에서 신경 써줘야 하는 게 있음 ㅎㅋㅎㅋ)

 

레퍼런스 카운팅은 오직 클래스의 인스턴스에만 적용됩니다.

말 그대로 reference counting 참조 카운팅 = 레퍼런스 카운팅은 참조 타입만 해당합니다.

구조체/struct와 열거형/enum은 값 타입이므로 참조값을 저장하거나 전달하지 않아 이에 해당하지 않습니다. 

ARC 동작 방식

클래스의 새 인스턴스를 만들 때마다 ARC는 해당 인스턴스에 대한 정보를 저장하기 위해 메모리를 할당합니다. 

메모리는 인스턴스의 타입 정보와 인스턴스의 값을 가집니다.

그리고 인스턴스가 더 이상 필요하지 않을 때 ARC는 메모리를 해제시켜 다른 곳에 사용될 수 있도록 합니다. 

필요하지 않을 때 메모리 공간을 차지하지 않으니 효율적입니다.

 

하지만 

사용 중인 인스턴스 할당을 해제하면 인스턴스의 프로퍼티들과 메소드들에 접근할 수 없으며 접근하게되면 앱이 중단될 가능성이 큽니다.

이를 위해 ARC는 클래스 인스턴스를 참조하는 속성, 상수 및 변수의 수를 추적하고 관리합니다.

또한 사용중인 참조가 하나 이상 존재하면 사용 중이라고 판단해 인스턴스 할당을 해제하지 않습니다.

 

예를들어 Person클래스를 정의합니다. 

(ARC가 Person인스턴스를 추적하고 관리합니다.)

 

class Person {
    let name: String
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    deinit {
        print("\(name) is being deinitialized")
    }
}

 

클래스 인스턴스가 생성되면 init이 호출되고 인스턴스가 해제될 때 deinit이 호출됩니다.

 

var reference1: Person?
var reference2: Person?
var reference3: Person?

 

세 변수를 정의했습니다.

 

reference1 = Person(name: "John Appleseed")

 

Person클래스 인스턴스를 생성해 reference1에 할당했습니다.

그럼 John Appleseed is being initialized가 출력됩니다.

초기화할 때 init이 호출 되니깐요!

(ARC 참조 카운트 + 1)

 

Person 인스턴스가 reference1 변수에 할당되어있으며 reference1은 강하게 참조하고 있습니다.

 

동일한 Person 인스턴스를 나머지 변수에게 할당해줍니다.

 

reference2 = reference1
reference3 = reference1

 

두 개의 강한 참조가 생깁니다.

(ARC 참조 카운트 + 1)

(ARC 참조 카운트 + 1)

 

지금까지 Person인스턴스에 3개의 강한 참조가 존재합니다.

 

이때 두 개의 변수에 nil을 할당해줍니다.

 

reference1 = nil
reference2 = nil

 

(ARC 참조 카운트 - 1)

(ARC 참조 카운트 - 1)

 

두개의 변수에 nil을 할당해주어도 하나의 강한 참조가 남아있기 때문에 Person인스턴스가 할당 해제되지 않습니다.

ARC는 나머지 하나의 강한 참조가 없어질 때까지 인스턴스의 할당을 해제하지 않습니다.

왜냐... 사용 중인 참조가 하나 이상 존재하면 사용 중이라고 판단해 인스턴스 할당을 해제하지 않습니다.

 

그럼 언제 Person인스턴스가 할당 해제될까요.

 

바로 reference3에 nil을 할당해주어야 그때 Person 인스턴스가 할당 해제됩니다.

 

reference3 = nil

 

(ARC 참조 카운트 - 1)

reference3에 nil을 할당해주어야 참조 카운트가 0이 되고 그 시점에 Person인스턴스를 더 이상 사용하지 않는다고 판단하고 deinit이 됩니다. 이때 John Appleseed is being deinitialized가 출력됩니다.

 

 

https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html

 

Automatic Reference Counting — The Swift Programming Language (Swift 5)

Automatic Reference Counting Swift uses Automatic Reference Counting (ARC) to track and manage your app’s memory usage. In most cases, this means that memory management “just works” in Swift, and you do not need to think about memory management yourself. A

docs.swift.org

 

반응형

'개발 > Swift' 카테고리의 다른 글

Swift ARC에 대해서(3)  (0) 2019.04.20
Swift ARC에 대해서(2)  (0) 2019.04.19
Swift String Substring  (0) 2019.04.12
isEmpty와 count == 0 비교하기  (2) 2019.04.05
스위프트 Copy-On-Write  (0) 2019.03.29