약한 참조(Weak reference)
- 약한 참조는 참조하는 인스턴스를 강하게 유지하지 않는 참조이다. 따라서 ARC가 참조된 인스턴스를 처리하는 것을 중지하지 않는다. 이는 프로퍼티 변수 선언 전에 weak 키워드를 위치시켜서 약한 참조를 나타낸다.
- 약한 참조는 참조하는 인스턴스를 강하게 유지하지 않으므로 약한 참조 동안 해당 인스턴스가 할당 해제될 수 있다. 따라서 ARC는 참조하는 인스턴스가 할당 해제되면 nil로 약한 참조를 자동 설정한다. 그리고 약한 참조는 런타임에 값을 nil로 변경하는 것을 허락해야 하므로, 항상 옵셔널 타입의 상수가 아니고 변수로 선언된다.
class Person {
let name : String
init(name : String) {
self.name = name
}
var apartment : Apartment?
deinit {
print("\(name) is being deinitialized")
}
}
class Apartment {
let unit : String
init(unit : String) {
self.unit = unit
}
weak var tenant : Person?
deinit {
print("Apartment is faded")
}
}
var john : Person?
var unit4A : Apartment?
john = person(name : "John")
unit4A = Apartment(unit : "4A")
john!.apartment = unit4A
unit4A!.tenant = john
john = nil
unit4A = nil
미소유 참조(Unowned reference)
- 약한 참조와 마찬가지로 미소유 참조는 참조하는 인스턴스를 강하게 유지하지 않는다. 그러나 약한 참조와 다르게 미소유 참조는 다른 인스턴스의 수명이 같거나 긴 경우에 사용된다.
- 프로퍼티 변수 선언 전 unowned키워드를 위치시켜서 미소유 참조를 나타낸다.
- 약한 참조와 다르게 미소유 참조는 항상 값을 가지도록 예상된다. 결과적으로 미소유로 만들어진 값은 옵셔널이 아닌 ARC는 미소유 참조값을 nil로 설정하지 않는다.
- 참조가 '항상' 할당해제되지 않은 인스턴스를 참조한다고 확신하는 경우에만 미소유 참조를 사용한다. 인스턴스가 할당 해제된 후 미소유 참조값에 접근하려고 하면 에러가 난다.
class Customer {
let name : String
var card : CreditCard?
init(name : String) {
self.name = name
}
deinit {
print("customer instance is faded")
}
}
class CreditCard {
let number : UInt64
unowned let customer : Customer
init(number : UInt64, customer : Customer) {
self.number = number
self.customer = customer
}
deinit {
print("Card is deinitialized")
}
}
var john : Customer?
john = Customer(name : "John")
john!.card = CreditCard(number : 123123, customer : john!)
john = nil