Notice
Recent Posts
Recent Comments
Link
«   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
Tags more
Archives
Today
Total
관리 메뉴

도니의 iOS 프로그래밍 세상

[Swift] ARC의 정의 및 이해 - ARC의 기초 - 1탄 본문

Swift

[Swift] ARC의 정의 및 이해 - ARC의 기초 - 1탄

Donee 2022. 12. 31. 20:17

1. ARC가 무엇인가?

Swift에서는, 사용자 앱의 메모리 사용을 추적하고 관리할 때 Automatic Reference Counting (ARC)라는 것을 사용한다.
대부분 메모리 사용을 사용자가 직접 관리해야 하는 C와 다르게,

더이상 메모리에서 사용하지 않는다고 판단했을 때 자동으로 ARC를 통해 클래스 "객체"를 메모리로부터 Free 시킨다.

2. ARC의 판단기준

특정 객체가 더이상 사용되지 않는 다는 것을 ARC는 어떻게 판단할까?
ARC는 특정 클래스 객체를 참조하는 변수, 상수, 프로퍼티들의 갯수를 카운팅한다.
특정 객체에 "적어도" 하나라도 참조변수가 존재한다면 ARC에서는 메모리 해제를 발생하지 않는다.
반대로, 활성화된 참조변수가 존재하지 않는다면 ARC는 특정 객체를 메모리로부터 "해제"시킵니다.

쉽게 말해, 특정 객체 하나가 존재하고 이를 여러곳의 변수가 참조할때 한 객체에 대한 count가 증가한다고 생각하시면 됩니다.
밑의 간단한 예제를 살펴볼까요?

class SomeValue {
    var name: String
    init(name: String) {
        self.name = name
    }
}
let someValue = SomeValue(name: "팀쿡") // reference count => 1
let someValue2 = someValue // reference count => 2

팀쿡이라는 SomeValue의 클래스 객체는 someValue, someValue2 두 variable에서 참조하고 있습니다.
따라서 팀쿡 객체의 reference Count는 2입니다.

ARC 예제

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

reference1 = Person(name: "John Appleseed")
reference2 = reference1
reference3 = reference1

일단, reference1, reference2, reference3의 name이 무엇일까요?
만약, 정답에 대한 확신이 들지 않는다면 Value Type과 Class Type에 관한 글을 먼저 읽고 오면 이해가 더욱 잘됩니다.

정답은? 모두 John Appleseed입니다. reference type이기 때문에 한번 선언된 instance를 모두 reference 1, 2, 3가 참조하는 구조입니다.
그럼 이때 John Appleseed라는 이름을 가진 Person 객체의 reference count는 몇일까요?
위에서 설명했듯이 3입니다!

reference1 = nil
reference3 = nil
reference2 = nil 

위의 코드가 이어서 존재한다면, John Appleseed라는 객체의 reference count는 몇일까요?
reference1, 3, 2에서 차례로 참조를 하지 않음으로써 reference count 3 -> 2 -> 1 -> 0가 됩니다.

ARC에서는 특정 객체를 메모리로부터 언제 해제시킨다고 했죠?

활성화된 참조변수가 존재하지 않는다면 ARC는 특정 객체를 메모리로부터 "해제"시킵니다. 

따라서 reference2가 nil이 된 시점에, 메모리로부터 해제됩니다. 메모리로부터 해제되기 때문에 deinit이 발생하게 됩니다.

결론

reference count를 +,- 시키는 것만으로 메모리 관리를 완벽하게 수행하는 Swift가 참 신기했었습니다.
하지만 이렇게 단순한 룰에는 몇가지 예외사항이 존재하겠죠?
다음편에서는 count를 +,-시키는 것으로 인해 발생하는 Strong Reference Cycle을 알려드리겠습니다.
감사합니다

참고 사이트

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

Comments