일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |
- 설계 재사용
- iSP
- OCP
- 객체지향
- 하향식 접근
- 일관성 있는 협력
- 합성
- 상속
- 유연한 설계
- Apple # HIG #iOS15 #iOS14 #Human #Interface #Guidelines #Apple developer # Apple human interface guidelines
- '기존 설계 재사용
- 오브젝트
- dip
- 객체 생성 사용 분리
- 서브 타이핑
- 다형성
- 책임주도설계
- 유여난 설계
- 믹스인
- OOP
- 명령-쿼리 분리
- 행동 호환성
- 상속 조합 폭발적 증가
- 의존성
- Swift#flatMap#map#Monad#함수형 프로그래밍#Optional
- 알고리즘
- 추상화
- 런타임 의존성
- 컴파일 타임 의존성
- 메서드를 통한 해결
- Today
- Total
도니의 iOS 프로그래밍 세상
[Swift] ARC의 정의 및 이해 - ARC의 기초 - 1탄 본문
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
'Swift' 카테고리의 다른 글
[Swift] ARC와 클로저, 클로저 memory leak - ARC 기초편 4탄 (0) | 2023.01.11 |
---|---|
[Swift] weak, unowned 차이 - ARC 기초편 3탄 (0) | 2023.01.10 |
[Swift] Strong Reference Cycle - ARC 기초 2탄 (0) | 2023.01.08 |
[Swift] COW(Copy On Write) - 메모리 절약 방법 - Structure 응용편, OS응용편 (1) | 2023.01.02 |
[Swift] Struct와 Class의 차이(Value Type, Reference Type) - 기초편 (0) | 2022.12.31 |