为什么初始化为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()
之外,因为我想从其他方法引用该实例。在这种情况下,最好的方法是什么?
答案 0 :(得分:16)
weak
表示变量不保留对象,如果没有其他强引用,它将被解除分配。 @IBOutlet
weak
变量不是nil,因为这些视图具有来自视图控制器视图层次结构的强引用。
您必须强烈引用您的按钮,然后将其添加到视图层次结构中,然后才能将其分配给弱属性,或者只是不使用weak
属性。