Я читал о unowned из документов Apple.

Как и слабые ссылки, бесхозная ссылка не имеет сильной связи с экземпляром, на который она ссылается. Однако, в отличие от слабой ссылки, предполагается, что у незарегистрированной ссылки всегда есть значение. Из-за этого бесхозная ссылка всегда определяется как необязательный тип.

Таким образом, кажется, что unowned похожи на weak, но они не являются опциями.

Мне было интересно, что произойдет, если освободить указанное unowned. Почему нет проверок типа опционов.

Я имею в виду, что могу сделать что-то подобное,

class Customer {
    let name: String
    var card: CreditCard?
    init(name: String) {
        self.name = name
    }
    deinit { print("\(name) is being deinitialized") }
}

class CreditCard {
    let number: UInt64
    unowned let customer: Customer
    init(number: UInt64, customer: Customer) {
        self.number = number
        self.customer = customer
    }
    deinit { print("Card #\(number) is being deinitialized") }
}

var card: CreditCard? = nil
do {
    var john: Customer
    john = Customer(name: "John Appleseed")
    john.card = CreditCard(number: 1234_5678_9012_3456, customer: john)
    card = john.card
}

print("Card belongs to \(card?.customer.name)")

В последней строке, предполагая, что unowned всегда имеет значение, попробуйте напечатать имя держателя карты, и я получил сообщение «Выполнение было прервано, причина: EXE_BREAKPOINT ...»

Полагаю, такой проблемы быть не должно или должна быть какая-то проверка безопасности на строке card = john.card

1
BangOperator 28 Апр 2016 в 16:02

2 ответа

Лучший ответ

Ссылки unowned полезны для разрыва цикла ссылок в качестве альтернативы weak, когда (как указано в документации Apple, на которую вы ссылаетесь) «вы знаете, что ссылка никогда не будет нулевой, если она была установлена во время инициализации».

Однако вы сфабриковали пример установки ссылки unowned на объект, который затем выходит за пределы области видимости, делая ссылку unowned равной нулю.

0
Mike Pollard 28 Апр 2016 в 13:29

Проверенная версия unowned уже есть - она называется weak. Это главное отличие. unowned небезопасно, но в некоторых случаях может сделать ваш код более понятным.

2
Kirsteins 28 Апр 2016 в 13:30