Я читал о 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
2 ответа
Ссылки unowned
полезны для разрыва цикла ссылок в качестве альтернативы weak
, когда (как указано в документации Apple, на которую вы ссылаетесь) «вы знаете, что ссылка никогда не будет нулевой, если она была установлена во время инициализации».
Однако вы сфабриковали пример установки ссылки unowned
на объект, который затем выходит за пределы области видимости, делая ссылку unowned
равной нулю.
Проверенная версия unowned
уже есть - она называется weak
. Это главное отличие. unowned
небезопасно, но в некоторых случаях может сделать ваш код более понятным.
Похожие вопросы
Связанные вопросы
Новые вопросы
swift
Swift — это язык программирования общего назначения, разработанный Apple Inc., впервые выпущенный в 2014 году для своих платформ и Linux. Swift имеет открытый исходный код. Используйте тег только для вопросов о языковых функциях или необходимости кода в Swift. Используйте теги [ios], [ipados], [macos], [watch-os], [tvos], [swiftui], [cocoa-touch] и [cocoa] для (не зависящих от языка) вопросов о платформах или рамки.