
드디어 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