Per:
@IBOutlet weak var nameLabel: UILabel!
每当我声明IBOutlets时,我只使用var而不是weak var。但最近我遇到了一些代码模板,它们使用weak var。他们为什么这样做?有什么附加的好处吗?
为什么在UILabel的末尾有一个bang运算符。我知道它是必需的,我会用它,但现在想问一下。
谢谢事先。
Per:
@IBOutlet weak var nameLabel: UILabel!
每当我声明IBOutlets时,我只使用var而不是weak var。但最近我遇到了一些代码模板,它们使用weak var。他们为什么这样做?有什么附加的好处吗?
为什么在UILabel的末尾有一个bang运算符。我知道它是必需的,我会用它,但现在想问一下。
谢谢事先。
因为视图元素是由视图(强烈)拥有的,所以出口较弱。我认为你的视图控制器也可以有一个强引用,但没有必要。
弱变量是可选的,因为它们可以是nil
。你可以用?
声明你的输出口,但这意味着每次都使用强制解包或可选绑定。将它们声明为隐式展开的可选项!
只是一种方便。
someLabel.text = "some text"
@IBOutlet weak var someLabel: UILabel?
?
。someLabel?.text = "some text"
nil
。然而,当 viewDidLoad
被调用时,@IBOutlets
将被初始化。 - Petter@IBOutlets
在控制器的awakeFromNib
被调用之前就已经被初始化了。 - BangOperator@gregheo的回答是最好的解释,进一步阐述:在这种情况下,如果考虑所有权,由@IBOutlet
引用的View对象通常不应该由引用它的View Controller拥有。
相反,它应该由其父视图拥有,无论它在树中的位置如何(可以通过UIView.subviews
强烈拥有)。View Controller强烈拥有它的View Tree的根(UIViewController.view
)。 weak
明确声明了一个非拥有引用,在View Controller的生命周期的不同点可能变为nil。
在这里,我提供使用隐式展开可选引用的替代方法:!
是一种危险的做法,会削弱Swift提供给我们的工具。从Xib或Storyboard加载的View Controller在创建后和View加载之前的时间内,@IBOutlet
引用始终为nil,每次都是如此。假设在那段时间里没有人操作成员意味着没有使用Swift语法和编译器的反馈来帮助我们。
此外,@IBOutlet
是一种强大的工具,可以在设计屏幕或视图时实现灵活、视觉化的方法。通常,您的View Controller会为所有可用信息公开@IBOutlet
,无论是否已知将使用它们,并在从Interface Builder内部构建和迭代View时分别决定实际连接和使用哪些。
此外,如果您的View应该足够灵活,可以从Xib/Storyboard和代码中实例化,那么根据您决定引用的子视图如何实例化和连接,它们可能立即可用或不可用。
@IBOutlet weak var nameLabel: UILabel?