为什么初始化为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
属性。