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

Bla*_*ard 12 weak-references ios swift

为什么初始化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)")
}
Run Code Online (Sandbox Code Playgroud)

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

nil, <UIButton: 0x7f946bc424a0; frame = (0 0; 100 100); opaque = NO; layer = <CALayer: 0x7f946bc42920>>
Run Code Online (Sandbox Code Playgroud)

但为什么第一次回归nil呢?我认为如果你将变量定义为weak,那么当定义"weaked变量"(self在这种情况下)的视图控制器消失时,"weaked变量"就会根据它消失.但是,我相信我不会删除代码中未分配nil给它的ViewController实例,尤其是在其viewDidLoad()方法中.

所以如果我正确地说,为什么"weaked变量" nil在启动时会返回?当我使用它时@IBOutlet,它不会变成nil(但我不需要明确地将它用于异步).我应该在没有weak想要在代码中进行异步化时定义实例变量,特别是在viewDidLoad()

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

Kir*_*ins 16

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

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