728x90
반응형
안녕하세요 🐶
빈 지식 채우기의 비니🙋🏻♂️ 입니다.
오늘은 ARC의 기본 개념과 Reference Count에 대해 알아보는 시간을 가지겠습니다.
1. 개요
ARC ( Auto Reference Counting ) : 말 그대로 '자동 참조 카운팅' 이다. 즉 효과적으로 메모리 관리를 할 수 있게 해주는 도구이다.
🙋🏻♂️ 메모리 관리를 수행하는 이유는 무엇일까요?
앱의 퍼포먼스를 좋게 유지하기 위해서는 메모리 관리가 기본이다.
크게 메모리 라고 하면 Heap 영역, Stack 영역이 있다.
이 중 Stack 영역에 저장된 데이터는 특별한 관리가 필요 없다.
👉🏻 Stack 영역은 값 타입이다. ( Type Of Value )
👉🏻 Stack 영역에 저장되어 있다가 호출이 되는 순간 POP이 되기 때문에 자동으로 관리가 된다.
그러나 Heap 메모리에 저장된 데이터는 참조 타입이므로, 개발자가 수동적으로 관리를 해줘야 한다.
👉🏻 Heap 영역은 참조 타입이다. ( Type Of Reference )
따라서 Heap 메모리에 저장된 데이터를 효과적으로 관리를 수행하기 위해 ARC를 사용한다.
이렇게 개발자는 효과적인 메모리 관리를 하기 위해서 retain, release 를 사용하였다.
이러한 메모리 관리 방법을 Reference Counting ( Retain Counting ) 이라고 한다.
아니 그러면 retain, release 가 뭐야..? ¯ࡇ¯
ㅎㅎ 밑에서 바로 알아보자
2. 레퍼런스 카운팅 ( Reference Counting )
retain, release 를 통해 참조 카운트를 증감시키는 일
2-1. retain, release
👉🏻 retain
- 객체의 reference count를 증가시킨다.
- 객체가 메모리에서 해제되지 않도록 이 함수의 카운트를 증가시킨다.
👉🏻 release
- 객체의 reference count를 감소시킨다.
- 객체가 더 이상 필요로 하지 않을 때 이 함수의 카운트를 감소시킨다.
효과적인 이해를 돕기 위해 간단히 그림을 가져와봤다.
- compile time 에는 코드를 분석하고 예측하여 적절한 시기에 retain, release 를 수행한다.
- run time 에는 삽입된 코드가 실행되면서, retain, release에 의해 reference count가 증감하고, count가 0이 되면 메모리에서 해제한다.
3. ARC 동작 구현
위에서 그린 그림을 바탕으로, ARC의 동작을 보여주는 간단한 코드를 작성해봤다.
class ARC {
let type: String
init(type: String) {
self.type = type
print("\(type) : Init")
}
deinit {
print("\(type) : deInit")
}
}
func testARC() {
var A: ARC?
var B: ARC?
A = ARC(type: "ARC 동작 코드") // (1)
B = A // (2)
A = nil // (3)
B = nil // (4)
}
- A 는 ARC 클래스의 인스턴스이다.
- 현재 A의 Reference Count는 1 이다.
- B가 A를 참조하게 했다.
- 현재 A의 Reference Count는 2 이다.
- A의 인스턴스 참조를 해제를 하였다.
- 현재 A의 Reference Count는 1 이다.
- B의 인스턴스 참조를 해제를 하였다.
- 현재 A의 Reference Count는 0 이다.
- 고로 deinit이 호출된다.
4. 결론
ARC는 다음과 같이 정의 및 설명을 할 수 있다.
1. retain, release를 통해 적절한 때 reference count를 자동으로 증감을 해준다.
2. MRC 와 다르게 자동으로 관리를 해주기 때문에 효과적으로 메모리 관리를 수행해주는 도구이다.
이상으로 ARC (1) 기본 개념, Reference Count 이해 포스팅을 마치겠습니다.
다음으로 ARC (2) Retain Cycle, 강한참조, 약한참조 그리고 미소유참조 에 대해 공부해보도록 하겠습니다.
틀린 부분이나 궁금한 사항은 댓글 남겨주세요~🤭
참고
728x90
반응형
'iOS 🖥️ > Swift' 카테고리의 다른 글
[ Swift ] KVC(Key-Value-Coding), KVO(Key-Value-Observing) (0) | 2023.01.05 |
---|---|
[ Swift ] 서브스크립트 ( Subscript ) (0) | 2022.12.30 |
[ Swift ] ARC (2) Retain Cycle, 강한참조, 약한참조 그리고 미소유참조 (0) | 2022.12.29 |
[ Swift ] COW ( Copy-On-Write ) (0) | 2022.12.27 |
[ Swift ] Class vs Struct (0) | 2022.12.26 |