[swift] unowned 참조의 nil 처리

앱을 개발하다 보면 strong 참조 사이클을 피하기 위해 unowned 참조를 사용해야 하는 경우가 있습니다. 하지만 unowned 참조는 참조 대상이 더 이상 존재하지 않을 때 런타임 에러가 발생하므로, 이에 대한 적절한 처리가 필요합니다. 특히, 참조 대상이 nil이 될 가능성이 있는 경우에는 더욱 신경 써야 합니다. 이번 글에서는 unowned 참조의 nil 처리 방법에 대해 알아보겠습니다.

unowned 참조란?

unowned 참조는 참조 대상이 항상 존재한다고 가정하는 참조 방식입니다. 따라서 참조 대상이 nil이 될 가능성이 없는 경우에만 사용해야 합니다. unowned 참조는 강제 해제(!)가 필요 없고, 참조 대상이 해제된 후에도 메모리를 해제할 수 있습니다.

nil 처리 방법

만약 unowned 참조 대상이 nil이 될 가능성이 있는 경우에는 weak 참조를 사용하는 것이 안전합니다. 하지만 unowned 참조를 사용해야 하는 상황이라면, Optional Binding을 통해 nil 처리를 해주어야 합니다.

class Person {
    unowned var car: Car?

    init(car: Car) {
        self.car = car
    }
}

class Car {
    var owner: Person?

    init(owner: Person) {
        self.owner = owner
    }

    deinit {
        print("Car is being deinitialized")
    }
}

var person: Person? = Person(car: Car(owner: person!))

if let car = person?.car {
    print("Person has a car")
} else {
    print("Person does not have a car")
}

위의 예시에서는 unowned 참조를 사용하여 PersonCar를 참조하고 있습니다. 이때 Person이 nil이 될 가능성이 없는 상황에서만 unowned 참조를 사용하고, nil 처리를 위해 Optional Binding을 사용하였습니다.

unowned 참조를 사용할 때에는 참조 대상이 항상 존재함을 확신할 수 있는 상황에서만 사용해야 하며, nil 처리에 대한 책임을 꼭 지켜주어야 합니다.

참조: Apple Developer Documentation