[swift] unowned 참조의 사용 시 주의점
unowned
참조는 Swift에서 메모리 누수를 피하기 위해 사용되는 강한 참조 유형 중 하나입니다. 하지만 이러한 참조를 사용할 때 주의해야 할 몇 가지 사항이 있습니다.
1. 참조 대상의 생명주기
unowned
참조는 참조 대상이 해제되지 않는다고 확신할 때 사용해야 합니다. 만약 참조 대상이 먼저 해제된다면, unowned
참조는 더 이상 유효하지 않은 메모리를 가리키게 되어 런타임 오류가 발생합니다.
class Person {
var card: CreditCard?
deinit {
print("Person 인스턴스가 해제되었습니다.")
}
}
class CreditCard {
unowned var owner: Person
init(owner: Person) {
self.owner = owner
}
deinit {
print("CreditCard 인스턴스가 해제되었습니다.")
}
}
var person: Person? = Person()
person!.card = CreditCard(owner: person!)
person = nil // Person 인스턴스가 해제됨
// 런타임 오류: unowned 참조는 이미 해제된 인스턴스를 가리킵니다.
2. nil 대신 옵셔널로 선언
unowned
참조는 참조 대상이 항상 존재한다고 확신할 때만 사용해야 합니다. 그렇지 않은 경우에는 옵셔널 타입으로 선언하여 안전하게 참조할 수 있도록 해야 합니다.
class Apartment {
unowned var owner: Person?
init(owner: Person) {
self.owner = owner
}
}
var person: Person? = Person()
let apartment = Apartment(owner: person!) // owner 속성은 non-optional로 선언되었으나 person이 nil이 될 수 있음
unowned
참조의 사용은 신중하게 고려해야 하며, 해당 참조 대상의 생명주기를 정확히 이해하고 관리해야 합니다.
참조