swift - ARC(自动引用计数)实战

标签 swift automatic-ref-counting

我目前正在关注 Apple Documentation .这是我的问题:

class Person {
    let name: String
    init(name: String) {
        self.name = name
        println("\(name) is being initialized")
    }
    deinit {
        println("\(name) is being deinitialized")
    }
}

class ViewController: UIViewController {
    override func viewDidLoad() {
        super.viewDidLoad()

        var reference1: Person?
        var reference2: Person?
        var reference3: Person?
        reference1 = Person(name: "John Appleseed")
        // prints "John Appleseed is being initialized
        reference2 = reference1
        reference3 = reference1

        reference1 = nil
        reference2 = nil
    }
}

reference1 等于 nil 之后,ARC 释放实例并打印 "John Appleseed is being deinitialized"

它不应该在 reference3 = nil 之后被释放吗?

最佳答案

这里的问题是范围问题。我们可以通过断点找到更多信息。

在这里,我们在初始化 reference1 之前停止。
所有变量都应该是 nil:

enter image description here

然后在 reference1 初始化之后呢?

enter image description here


好的,让我们跳到 reference2reference3 设置之后:

enter image description here

所有三个变量都指向相同的内存位置,我们可以看到初始化程序只运行了一次。这些都指向同一个位置。

让我们向前走:

enter image description here

reference1 现在指向 None。它是 nildeinit mmethod 尚未被调用并打印其消息。

让我们更进一步:

enter image description here

现在 reference1reference2 都应该是 nil。调用了我添加的 println 语句。但是 deinit 没有运行并且 reference3 不是 nil

下一步是逐步退出方法。一旦我们离开方法,变量就超出范围并且调用 deinit:

enter image description here

关于swift - ARC(自动引用计数)实战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30457328/

相关文章:

ios - 方法返回的对象会被放入自动释放池吗?

ios - 除了代码之外,是否可以检查位置是否已启用?

ios - 单击 DatePicker 时 UITapGestureRecognizer 不工作

ios - 扫描数组查找条件,返回索引以扫描所述索引处的 Array2 值

ios - swift 链接器命令失败,退出代码为 1 Google Maps iOS Util pod install

ios - block 递归和中断保留循环

ios - 复制自定义数组而不指向 iOS ARC 中的旧数组

Objective-C ARC 和传递 C 对象数组

ios - 什么时候释放保留对象(分配给弱变量对象)

ios - 如何配置自定义 UITableViewCell 一次?