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

标签 ios swift weak-references

为什么对 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/

相关文章:

android - WordPress 主题中的简单 Android 与 iOS 检测

ios - 应用程序在 iPad 上崩溃但不是模拟器

ios - 每次单击按钮后,如何在 UILabel 上逐一显示文本?

swift - 如何确定事件文本字段

java - WeakReference 没有收集在大括号中?

c# - 并发使用 Wea​​kReference<T>?

java - 为什么ReferenceQueue总是空的?

javascript - FBSDK: 无法读取属性 loginwithread permissions of undefined

swift - UITableViewCell 按钮和分段控件

swift - Firebase 数据描述返回空数组