약한 참조와 비소유 참조 모두 참조는 하되, 가리키는 인스턴스의 숫자(RC)를 올라가지 않게 하는 방법.
class Nation {
var name: String
weak var person: Citizen? // 약한 참조
init(name: String) {
self.name = name
}
deinit {
print("\(name) 메모리 해제")
}
}
class Citizen {
var name: String
weak var state: Nation? // 약한 참조
init(name: String) {
self.name = name
}
deinit {
print("\(name) 메모리 해제")
}
}
var me: Citizen? = Citizen(name: "June")
var korea: Nation? = Nation(name: "SouthKorea")
// 강한 참조 사이클이 일어나지 않는다.
me?.state = korea
korea?.person = me
// 메모리 해제 ok (이 경우엔 한쪽만 weak로 선언해도 됨)
me = nil
korea = nil
class Nation {
var name: String
unowned var person: Citizen? // 비소유 참조
init(name: String) {
self.name = name
}
deinit {
print("\(name) 메모리 해제")
}
}
class Citizen {
var name: String
unowned var state: Nation? // 비소유 참조
init(name: String) {
self.name = name
}
deinit {
print("\(name) 메모리 해제")
}
}
var me: Citizen? = Citizen(name: "June")
var korea: Nation? = Nation(name: "SouthKorea")
// 강한 참조 사이클이 일어나지 않는다.
me?.state = korea
korea?.person = me
// 메모리 해제 ok (이 경우엔 한쪽만 unowned로 선언해도 됨)
me = nil
korea = nil
nil은 실제로 값이 없는게 아니고, 값이 없음을 나타내는 키워드.
nil은 값이 없음을 나타내는 열거형에서의 하나의 케이스일 뿐이다.
즉 nil이 있다는 것은 열거형이 존재한다는 뜻.
weak는 nil로 초기화되기 때문에 에러가 나지 않는다.
하지만 unowned는 nil로 초기화되지 않기 때문에, 즉 실제로 메모리 주소에 값이 존재하지 않기 때문에 에러가 나는 것이다.