В Свифте, непризнанная и слабая ссылка

Если у вас есть собака со слабой ссылкой на кость, это означает, что собака является "владельцем" ссылки в этой ситуации, и она использует кость, но кость может исчезнуть, и собака все еще может функционировать (потому что ссылка кость необязательна).

Однако при использовании "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 что значит:

Я хочу слабую ссылку, и она всегда будет заполнена.

Другие вопросы по тегам