Разница между бесхозным var что-то: Что-то! и слабый вар что-то: Что-то! в Свифте

Рассмотрим следующий пример, приведенный ниже:

      protocol Something: AnyObject { 
    func f()
}

class A {
    unowned var something1: Something!
    weak var something2: Something!

    func f() {
        something1.f()
        something2.f()
    }
}

В чем разница между типомsomething1иsomething2?

1 ответ

Краткое резюме:

это плохо, поскольку вы фактически принудительно разворачиваете переменную, которая, как предполагается (через ), появится в какой-то момент в будущем после установки.

лучше. Использование следует использовать только в том случае, если предполагается, что ссылка на переменную будет оставаться действительной дольше, чем время жизни переменной. Неявное развертывание предполагает, что ему никогда не будет присвоено значение.

Подробности. Давайте разобьем это на части.

  1. В чем разница между и ?

    Из главы ARC в книге Swift — Слабые ссылки :

    Слабая ссылка — это ссылка, которая не удерживает строгий контроль над экземпляром, на который она ссылается, и поэтому не мешает ARC избавиться от экземпляра, на который ссылается. Такое поведение не позволяет ссылке стать частью строгого ссылочного цикла. Вы указываете на слабую ссылку, помещая ключевое слово Weak перед объявлением свойства или переменной.

    Поскольку слабая ссылка не удерживает строгий контроль над экземпляром, на который она ссылается, этот экземпляр может быть освобожден, пока слабая ссылка все еще ссылается на него. Таким образом, ARC автоматически устанавливает слабую ссылку на ноль, когда экземпляр, на который она ссылается, освобождается. А поскольку слабые ссылки должны позволять изменять свое значение на ноль во время выполнения, они всегда объявляются как переменные, а не константы необязательного типа.

    Из главы ARC в книге Swift - Unowned References:

    Как и слабая ссылка, ссылка, не принадлежащая владельцу, не обеспечивает надежного контроля над экземпляром, на который она ссылается. Однако, в отличие от слабой ссылки, ссылка, не принадлежащая владельцу, используется, когда другой экземпляр имеет такое же или более длительное время жизни. Вы указываете ссылку, не имеющую владельца, помещая ключевое слово unowned перед объявлением свойства или переменной.

    В отличие от слабой ссылки ожидается, что бесхозная ссылка всегда будет иметь значение. В результате пометка значения как бесхозного не делает его необязательным, и ARC никогда не устанавливает значение бесхозной ссылки равным нулю.

    Из главы ARC в книге Swift — Неиспользуемые опции :

    Вы можете пометить необязательную ссылку на класс как бесхозную. С точки зрения модели владения ARC, необязательная необязательная ссылка и слабая ссылка могут использоваться в одних и тех же контекстах. Разница в том, что при использовании необязательной ссылки, не имеющей владельца, вы несете ответственность за то, чтобы она всегда ссылалась на действительный объект или имела значение ноль.

  2. Что такое неявно развернутый опционал (IUO)?

    Из главы «Основы» в книге Swift — «Неявно развёрнутые опции» :

    Как описано выше, опциональные параметры указывают, что константа или переменная могут не иметь значения. Необязательные параметры можно проверить с помощью оператора if, чтобы узнать, существует ли значение, и их можно условно развернуть с помощью необязательной привязки для доступа к значению необязательного параметра, если оно существует.

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

Для чего это означает?

Судя по описанию и , наличие переменной, которая является одновременно и является противоречием. предполагается, что оно будет установлено в какой-то момент после установки. предполагается, что оно не будет равно нулю, как только ему будет присвоено значение.

Итак, если у вас естьа позже ты попробуешь, ваша программа выйдет из строя, еслибыло установлено либо напрямую, либо из-за установки ARC из-за освобождения ссылки.

Использование - это ваш способ сказать компилятору: "Поверьте мне, оно никогда не будет равно нулю". Но использование говорит компилятору: «Осторожно, оно может быть нулевым». Этот брак обречен на развод.

Для чего это означает?

В отличие от , переменные могут быть как необязательными, так и необязательными. An является необязательным, но исключает необходимость обращаться с ним как с необязательным. Итак,является необязательным.

Судя по описанию и , наличие переменной, которая является одновременно и немного избыточной, но полезной. Создание переменной означает, что вы гарантируете, что после установки она сохранит ненулевое значение. предполагается, что оно не будет равно нулю, как только ему будет присвоено значение. Итак, оба преследуют одну и ту же цель.

Будучи , он не имеет сильной ссылки, поэтому имеет такое преимущество:. Но будучи необязательным, вы несете ответственность за то, чтобы он сохранял ссылку на действительный объект или был явно установлен на него (поскольку ARC не будет делать этого за вас). Существование, вы предполагаете, что этого никогда не произойдет, поэтому вам не нужно добавлять необходимый синтаксис, обычно используемый с опциями.

Итак, если у вас естьа позже ты попробуешь, ваша программа выйдет из строя, еслиссылается на освобожденный объект или если для него явно установлено значение .

Краткое содержание:

Не используйте. Это крах, ожидающий своего часа.

Использоватьесли вы можете установить значение в инициализаторе или объявленной области, вам не нужна сильная ссылка, и ссылка останется действительной после установки.

Использоватьесли вы не можете установить значение в инициализаторе или объявленной области, вы не будете пытаться получить доступ к переменной до тех пор, пока она не будет установлена, вам не нужна сильная ссылка, и ссылка останется действительной после установки начального значения.

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

Имейте в виду, что любое использование может привести к сбою, если указанный экземпляр был освобожден. Так что используйте толькокогда ты знаешь, что этого не произойдет.

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