참고 사이트 : https://babbab2.tistory.com/26
class Human {
var name: String?
init(name: String) {
self.name = name
}
}
let jimin = Human(name: "Jimin")
// 지역 변수 jimin은 stack 영역 이지만 Human instance의 경우 heap 영역
let minjung = jimin
// 인스턴스는 복사 되지 않고 heap 영역의 Human은 한 개만이 존재
// minjung, jimin이 사라지고 난 후에도 Human instance는 계속 존재
참조계산 시점:
- Runtime
- 앱 실행 동안 주기적으로 잠조를 추적, 사용하지 않는 instance를 해제
장점: 인스턴스가 해제될 확률이 높음
단점:
- 개발자가 참조 해제 시점을 파악할 수 없음
- Runtime 시점에 계속 추적하는 추가 리소스 필요로 성능저하 발생 가능성 존재
참조계산 시점:
- 컴파일 시점에 참조되고 해제되는지 결정되어 런타임 시 그대로 실행
장점:
- 개발자가 참조 해제 시점을 파악할 수 있음
- Runtime 시점에 추가 리소스가 발생하지 않음
단점:
- 순환 참조가 발생 시 영구적 메모리 해제가 되지 않을 수 있음
func makeClone(origin: Human) {
let clone = origin
//2. RC: 2 (jimin을 참조하는 clone 변수 생성 순간 + 1)
}
let jimin = Human(name: "jimin")
// 1. RC: 1 (인스턴스 생성 순간 + 1)
makeClone(jimin)
// 3. RC: 1 (clone 이 스택에서 해제되는 순간 - 1)
var jimin: Human? = Human(name: "Jimin") // 1. RC: 1
var clone = jimin // 2. RC: 2
clone = nil // 3. RC: 1
jimin = nil // 4. RC: 0
var jimin: Human? = Human(name: "Jimin") // jimin RC : 1
var minjung: Human? = Human(name: "Minjung") // minjung RC : 1
jimin = minjung // minjung RC : 2 , jimin RC : 0
class Contact {
var email: String?
init(email: String) {
self.email = email
}
}
class Human {
var name: String?
// Human class 속 Contact 클래스 인스턴스가 프로퍼티로 존재
var contact: Contact? = Contact(email: "jimin@naver.com")
init(name: String) {
self.name = name
}
}
let jimin: Human = .init(name: "Jimin") // Human RC: 1, Contact RC: 1, total RC : 2
jimin = nil
// nil 할당 순간 Human RC: 0
// Human Instance가 메모리에서 해제되면서 Contact Instance RC 감소