В Свифте, непризнанная и слабая ссылка
Если у вас есть собака со слабой ссылкой на кость, это означает, что собака является "владельцем" ссылки в этой ситуации, и она использует кость, но кость может исчезнуть, и собака все еще может функционировать (потому что ссылка кость необязательна).
Однако при использовании "unowned", по-видимому, ключевое слово "unowned" используется не в объявлении владельца ссылки, а в другом объекте. Например, ссылка Кости на свою собаку помечена как "не принадлежащая".
Unowned не является безопасным. Это может произойти сбой, если владелец перестает существовать в какой-то момент в программе, и это не может быть необязательным. Зачем кому-то использовать неподобающее, а не слабую ссылку?
Почему бы просто не использовать слабые? Насколько я понимаю, это просто связано с громким провалом или с молчанием. В случае неизвестного, приложение всегда будет зависать, если кость окажется без собаки, тогда как, если мы используем слабую, у вас останется кость, которая все еще существует, с собакой-призраком.
1 ответ
Сильные и слабые ссылки
Слабая ссылка - это ссылка, которая не удерживает сильную привязку к экземпляру, на который она ссылается, и, таким образом, не мешает ARC избавиться от ссылочного экземпляра.
Поэтому, когда A имеет слабую ссылку на B, тогда A НЕ является владельцем.
Пример (где А есть Bone
и Б Dog
)
class Dog {
var bone: Bone?
}
class Bone {
weak var belongsTo: Dog?
}
Сильная Ссылка
Здесь Dog
может иметь Bone
, В этом случае это владелец той кости. Итак bone
собственность является сильной ссылкой.
Слабая ссылкаBone
может принадлежать псу. Но мы должны объявить belongsTo
свойство как слабое, в противном случае у нас есть сильный цикл сохранения (что означает, что ARC не собирается освобождать эти объекты, как только мы закончим с ними).
Важно: в этом сценарии
Dog
может существовать безBone
, ИBone
может существовать безDog
,
Неизвестная ссылка
Давайте посмотрим на другой пример
class Person {
var creditCard: CreditCard?
}
class CreditCard {
unowned var owner: Person
init(owner: Person) {
self.owner = owner
}
}
Опять же, Person может владеть CreditCard, поэтому у него есть свойство owner, которое является сильной ссылкой на CreditCard
,
Однако
CreditCard
НЕ МОЖЕТ существовать без человека. Правильно? Так внутриCreditCard
мы хотим собственность, которая всегда будет заселена, но мы также хотим, чтобы она была слабой.
Что-то вроде этого
weak var owner: Person
error: 'weak' variable should have optional type 'Person?'
Однако слабое свойство должно быть объявлено как Optional
поэтому мы используем unowned
что значит:
Я хочу слабую ссылку, и она всегда будет заполнена.