为什么对 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
,那么当定义“弱变量”(在本例中为 self
)的 View Controller 消失时,“弱变量”是按照它走了。但是,我相信我不会在代码中删除 ViewController 的实例,而不是将 nil
分配给它,尤其是在它的 viewDidLoad()
方法中。
那么,如果我理解正确,为什么“弱变量”在启动时返回 nil
?当我将它与 @IBOutlet
一起使用时,它不会变成 nil
(不过我不需要显式地实例化它)。当我想从代码中实例化实例变量时,尤其是在 viewDidLoad()
中,我是否应该定义没有 weak
的实例变量?
我想在 viewDidLoad()
之外保留变量,因为我想从其他方法引用实例。在这种情况下,最好的方法是什么?
最佳答案
weak
表示变量不保留对象,如果没有其他强引用,它将被释放。 @IBOutlet
weak
变量不是 nil,因为这些 View 具有来自 View Controller View 层次结构的强引用。
您必须使用强引用来引用您的按钮并将其添加到 View 层次结构中,然后才能将其分配给弱属性,或者干脆不要使用 weak
属性。
关于ios - 为什么初始化为 `weak` 在 Swift 中返回 `nil`?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26137247/