问题 为什么初始化为`weak`会在Swift中返回`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变量”(self 在这种情况下)已经消失,“弱变量”已经消失了。但是,我相信我不会删除代码中未分配的ViewController实例 nil 对它,特别是在它内部 viewDidLoad() 方法。

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

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


8288
2017-10-01 08:32


起源

developer.apple.com/library/ios/documentation/Cocoa/Conceptual/... 第62页:新分配的对象没有强引用,因此立即取消分配并将someObject设置为nil。 - David Kaszas
在Swift中有两种类型的弱引用:weak与Objective-C中的相同并且是无主的。不同之处在于无主参考永远不会是零。 - gabbler


答案:


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

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


16
2017-10-01 08:37



好奇地问。那么在哪种情况下我应该使用弱?似乎我应该总是使用强大的if循环引用不会发生 - ikzjfr0