본문 바로가기
Swift Study

ARC

by 창브로 2024. 2. 20.
728x90

저번 포스팅에서 ARC를 몇 번 언급했었는데요 ARC가 무엇인지 알아보도록 하겠습니다.

ARC(Automatic Reference Counting)란?

ARC는 자동으로 메모리를 관리해 주는 방식입니다. 말 그대로 자동으로 참조관계를 카운팅 하는 것입니다!

참조를 카운팅 하는 것이니까 저번 포스팅에서 말했던 Struct에서는 사용하지 않겠죠?

참조 타입인 Class에서만 이 메모리 관리 방식을 사용합니다!

 

그럼 ARC는 어떻게 작동할까?

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

시간이 지나 더 이상 메모리에서 사용하지 않는다고 판단이 되면 자동으로 ARC를 통해 메모리로부터 할당 해제를 시킵니다.

메모리에서 사용을 하지 않는다고 판단하는 기준은 단 하나의 참조변수도 존재하지 않는 것입니다.

즉, 특정 인스턴스가 하나 존재하고 이를 여러 곳의 변수가 참조할 때 인스턴스에 대한 ARC count가 증가한다고 생각하시면 됩니다😀

이제 간단한 예시를 한 번 볼까요?!

 

class ChangbroClass {
    let name: String
    // 초기화 (메모리 할당될때)
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    // 초기화 해제 (메모리 해제될때)
    deinit{
        print("\(name) is being deinitialized")
    }
}


let broClass = ChangbroClass(name: "changbro") // reference count => 1
let broClass2 = broClass // reference count => 2

 

 

ChangbroClass라는 Class를 broClass와 broClass2에서 참조하고 있습니다.

보시다시피 ChangbroClass를 두 번 참조하고 있죠?

그래서 reference count가 2가 되었습니다. 어떤 식으로 카운팅이 되는지 이해가 되시나요?

다음 예제를 보겠습니다!

 

class ChangbroClass {
    let name: String
    // 초기화 (메모리 할당될때)
    init(name: String) {
        self.name = name
        print("\(name) is being initialized")
    }
    // 초기화 해제 (메모리 해제될때)
    deinit{
        print("\(name) is being deinitialized")
    }
}

var broClass: ChangbroClass? // reference count => 0
var broClass2: ChangbroClass? // reference count => 0
var broClass3: ChangbroClass? // reference count => 0

broClass = ChangbroClass(name: "changbro") // reference count => 1
broClass2 = broClass // reference count => 2
broClass3 = broClass // reference count => 3

broClass = nil // reference count => 2
broClass2 = nil // reference count => 1
broClass3 = nil // reference count => 0

 

broClass를 세 곳에서 참조하고 있는 예제입니다!

위 예제랑 같이 참조할 때마다 count가 늘어나는 것을 보실 수 있는데요

다른 점은 마지막에 nil로 초기화를 시켜 메모리에서 할당 해제해 주고 count를 내려주는 것을 볼 수 있습니다.

따라서 broClass3 = nil이 될 시점에 deinit이 발생하여 print 구문이 찍히게 됩니다.

 

이렇게 count를 +,-만으로 메모리를 관리하는 Swift가 정말 신기하다고 생각합니다.

하지만 이렇게 간단하기 때문에 주의하고 고려해야 할 점들이 있겠죠?!

다음 포스팅에서 하나씩 알아보겠습니다!

수고하셨습니다 😇

'Swift Study' 카테고리의 다른 글

Error Handling  (0) 2024.02.23
Optional  (0) 2024.02.21
weak, unowned  (0) 2024.02.20
Strong Reference Cycle  (0) 2024.02.20
Class vs Struct  (0) 2024.02.19