드디어 ARC이다!!!!
ARC를 제대로 배울라면 저번주차에서 다뤘던 참조타입과 메모리 구조에서 배운 Heap에 대한 이해가 있어야 된다!
간략하 설명하자면
- Swift의 클래스와 클로저는 Heap영역에 저장되는 참조타입이다.
- 참조타입의 특징은 지역변수는 단지 스택에 저장되어 인스턴스의 주소값을 가지고 있고
- 스택의 지역변수가 힙 영역의 실제 인스턴스를 참조하는 형태이다.
우리는 지금까지 걍 마음대로 클래스 만들어서 인스턴스 퐉퐈고파ㅗ가퐈 찍어내고 마음껏 사용했음. but Heap에 특징! 사용하고 난 후 반드시 메모리 해제를 해줘야 한다! 근데 한 사람????
아무도 없을것이다! 왜냐? 바로 ARC가 해주기 때문이다!
Automatic Reference Counting의 약자로, 클래스 인스턴스가 더 이상 필요하지 않을 경우 메모리를 자동으로 해제해주는 것이 주기능이다!
- ARC는 인스턴스에 대한 정보를 저장하기 위해 메모리의 청크에 할당합니다.
- 메모리 청크: malloc()으로 할당 받는 영역과 header를 포함한 영역
- 컴파일 시점에 언제 참조되고 해제되는지 결정되어 retain, release를 삽입을 한다!
- 런타임 때 결정되어 그대로 실행한다
- 인스턴스를 새로 생성할 때
- 기존 인스턴스를 다른 변수에 대입할 때
- 인스턴스를 가리키던 변수가 메모리에서 해제되었을 때
- nil이 지정되었을 때
- 변수에 다른 값을 대입한 경우
- 프로퍼티의 경우, 속해있는 클래스 인스턴스가 메모리에서 해제될 때
class Ayomi {
var name: String?
var age: Int?
init(name: String? = nil, age: Int? = nil) {
self.name = name
self.age = age
}
deinit {print("당신의 아요미 인생은 여기까지~")}
}
var hidi: Ayomi? = .init(name: "hidi", age: 23) // hidi Instance RC: 1
var hidiclone = hidi // hidi Instance RC: 2, hidiclone Instance RC: 2
hidiclone = nil // hidi Instance RC: 1
hidi = nil // hidi Instance RC: 0
var min: Ayomi? = .init(name: "min", age: 76) // min Instanc RC: 1
var minClone: Ayomi? = .init(name: "minClone", age: 5) // minClone Instance RC: 1
min = minClone // min Instance RC: 0, minClone Instance RC: 2
class Ayo {
var level: Int?
var ayomi: Ayomi? = .init(name: "ayomi", age: 20)
init(level: Int? = nil) {
self.level = level
}
}
var ayo: Ayo? = .init(level: 31)
ayo = nil