[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 참조의 사용은 신중하게 고려해야 하며, 해당 참조 대상의 생명주기를 정확히 이해하고 관리해야 합니다.

참조