Разница между бесхозным 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 ответ
Краткое резюме:
это плохо, поскольку вы фактически принудительно разворачиваете переменную, которая, как предполагается (через ), появится в какой-то момент в будущем после установки.
лучше. Использование следует использовать только в том случае, если предполагается, что ссылка на переменную будет оставаться действительной дольше, чем время жизни переменной. Неявное развертывание предполагает, что ему никогда не будет присвоено значение.
Подробности. Давайте разобьем это на части.
В чем разница между и ?
Из главы ARC в книге Swift — Слабые ссылки :
Слабая ссылка — это ссылка, которая не удерживает строгий контроль над экземпляром, на который она ссылается, и поэтому не мешает ARC избавиться от экземпляра, на который ссылается. Такое поведение не позволяет ссылке стать частью строгого ссылочного цикла. Вы указываете на слабую ссылку, помещая ключевое слово Weak перед объявлением свойства или переменной.
Поскольку слабая ссылка не удерживает строгий контроль над экземпляром, на который она ссылается, этот экземпляр может быть освобожден, пока слабая ссылка все еще ссылается на него. Таким образом, ARC автоматически устанавливает слабую ссылку на ноль, когда экземпляр, на который она ссылается, освобождается. А поскольку слабые ссылки должны позволять изменять свое значение на ноль во время выполнения, они всегда объявляются как переменные, а не константы необязательного типа.
Из главы ARC в книге Swift - Unowned References:
Как и слабая ссылка, ссылка, не принадлежащая владельцу, не обеспечивает надежного контроля над экземпляром, на который она ссылается. Однако, в отличие от слабой ссылки, ссылка, не принадлежащая владельцу, используется, когда другой экземпляр имеет такое же или более длительное время жизни. Вы указываете ссылку, не имеющую владельца, помещая ключевое слово unowned перед объявлением свойства или переменной.
В отличие от слабой ссылки ожидается, что бесхозная ссылка всегда будет иметь значение. В результате пометка значения как бесхозного не делает его необязательным, и ARC никогда не устанавливает значение бесхозной ссылки равным нулю.
Из главы ARC в книге Swift — Неиспользуемые опции :
Вы можете пометить необязательную ссылку на класс как бесхозную. С точки зрения модели владения ARC, необязательная необязательная ссылка и слабая ссылка могут использоваться в одних и тех же контекстах. Разница в том, что при использовании необязательной ссылки, не имеющей владельца, вы несете ответственность за то, чтобы она всегда ссылалась на действительный объект или имела значение ноль.
Что такое неявно развернутый опционал (IUO)?
Из главы «Основы» в книге Swift — «Неявно развёрнутые опции» :
Как описано выше, опциональные параметры указывают, что константа или переменная могут не иметь значения. Необязательные параметры можно проверить с помощью оператора if, чтобы узнать, существует ли значение, и их можно условно развернуть с помощью необязательной привязки для доступа к значению необязательного параметра, если оно существует.
Иногда из структуры программы ясно, что необязательный параметр всегда будет иметь значение после того, как это значение впервые установлено. В этих случаях полезно избавиться от необходимости проверять и разворачивать значение необязательного параметра каждый раз, когда к нему обращаются, поскольку можно с уверенностью предположить, что он имеет значение все время.
Для чего это означает?
Судя по описанию и , наличие переменной, которая является одновременно и является противоречием. предполагается, что оно будет установлено в какой-то момент после установки. предполагается, что оно не будет равно нулю, как только ему будет присвоено значение.
Итак, если у вас есть
Использование - это ваш способ сказать компилятору: "Поверьте мне, оно никогда не будет равно нулю". Но использование говорит компилятору: «Осторожно, оно может быть нулевым». Этот брак обречен на развод.
Для чего это означает?
В отличие от , переменные могут быть как необязательными, так и необязательными. An является необязательным, но исключает необходимость обращаться с ним как с необязательным. Итак,
Судя по описанию и , наличие переменной, которая является одновременно и немного избыточной, но полезной. Создание переменной означает, что вы гарантируете, что после установки она сохранит ненулевое значение. предполагается, что оно не будет равно нулю, как только ему будет присвоено значение. Итак, оба преследуют одну и ту же цель.
Будучи , он не имеет сильной ссылки, поэтому имеет такое преимущество:
Итак, если у вас есть
Краткое содержание:
Не используйте
Использовать
Использовать
Использовать
Имейте в виду, что любое использование может привести к сбою, если указанный экземпляр был освобожден. Так что используйте только