为什么Swift中对“weak”的初始化返回“nil”



为什么初始化为weak var会将变量返回为nil,而初始化为通常的var会返回预期结果?在ViewController.swift上的以下代码中:

weak var myButton: UIButton!
var myButtonNotWeak: UIButton!
override func viewDidLoad() {
    let frame = CGRect(x: 0, y: 0, width: 100, height: 100)
    myButton = UIButton(frame: frame)
    myButtonNotWeak = UIButton(frame: frame)
    print("(myButton), (myButtonNotWeak)")
}

这会将以下内容记录到控制台:

nil, <UIButton: 0x7f946bc424a0; frame = (0 0; 100 100); opaque = NO; layer = <CALayer: 0x7f946bc42920>>

但为什么第一个返回nil?我认为,如果您将一个变量定义为weak,那么当定义"weaked variable"(在本例中为self)的视图控制器不存在时,"weakeed variable"也随之不存在。然而,我相信我不会在代码中删除ViewController的实例而不将nil分配给它,尤其是在它的viewDidLoad()方法中。

那么,如果我得到正确的答案,为什么"weaked变量"在启动时会返回nil?当我将它与@IBOutlet一起使用时,它不会变成nil(但我不需要显式地实例化它)。当我想从代码中实例化实例变量时,尤其是在viewDidLoad()中,我应该在没有weak的情况下定义实例变量吗?

我想在viewDidLoad()之外保留变量,因为我想从其他方法引用实例。在这种情况下最好的方法是什么?

weak表示变量不保留对象,如果没有其他强引用,它将被释放。@IBOutlet weak变量不为零,因为这些视图具有来自视图控制器视图层次结构的强引用。

您必须使用强引用引用按钮并将其添加到视图层次结构中,然后才能将其分配给弱属性,或者干脆不使用weak属性。

最新更新