저번 포스팅에서 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 |