为什么初始化为`weak`会在Swift中返回`nil`?

时间:2014-10-01 08:32:41

标签: ios swift weak-references

为什么初始化为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变量”(在这种情况下为self)的视图控制器消失时,“weaked变量”就会消失了。但是,我相信我不会在代码中删除ViewController的实例而不会为其分配nil,尤其是在其viewDidLoad()方法中。

因此,如果我正确理解,为什么“weaked变量”在启动时返回nil?当我将它与@IBOutlet一起使用时,它不会变为nil(但我不需要明确地将它作为异步)。当我想要在代码中进行异步时,我应该在没有weak的情况下定义实例变量,特别是在viewDidLoad()内吗?

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

1 个答案:

答案 0 :(得分:16)

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

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

相关问题