Ответ @gregheo лучше всего объяснен для дальнейшего уточнения: если вы рассматриваете право собственности в этой ситуации, объект View, на который ссылается @IBOutlet
, обычно не должен принадлежать контроллеру представления, ссылающемуся на него.
Скорее, он должен принадлежать своему супервизору, где бы он ни находился в дереве (что происходит в строгом соответствии с UIView.subviews
). Контроллер представления вместо этого сильно владеет самым корнем своего дерева представлений (UIViewController.view
). weak
явно объявляет ссылку, не являющуюся владельцем, которая может стать нулевой в разные моменты жизни контроллера представления.
Здесь я бы предложил альтернативу использованию !
: использование неявно развернутой дополнительной ссылки — опасная практика, которая ослабляет инструменты, которые предлагает нам Swift. Контроллер представления, который загружается из Xib или раскадровки, включает в свое время жизни регулярное время после создания и до того, как его представление было загружено, где ссылка @IBOutlet
равна нулю, каждый раз. Предполагать, что никто не будет работать с членом в течение этого времени, означает не использовать грамматику Swift и обратную связь компилятора в наших интересах.
Кроме того, @IBOutlet
являются мощным инструментом, обеспечивающим гибкий, ориентированный на визуальное восприятие подход при проектировании экрана или представления. Общепринятой практикой является то, что ваш контроллер представления выставляет @IBOutlet
s для всей доступной информации, независимо от того, известно ли, что он будет использоваться, и отдельно решает, что на самом деле подключать и использовать при построении и итерации представления из интерфейса. Строитель.
Кроме того, если ваше представление должно быть достаточно гибким, чтобы его можно было создавать из Xib/Storyboard И из кода, в зависимости от того, как вы решите, что ссылочные подпредставления должны быть созданы и подключены, они могут быть или не быть доступными немедленно.