ARC(自动引用计数)在行动中

rid*_*cuk 6 automatic-ref-counting swift

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

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
    }
}
Run Code Online (Sandbox Code Playgroud)

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

不应该在之后解除分配reference3 = nil吗?

nhg*_*rif 6

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

在这里,我们在初始化之前就停止了reference1.
所有变量都是预期的nil:

在此输入图像描述

并在初始化后reference1

在此输入图像描述


好的,让我们跳到前面reference2reference3设置:

在此输入图像描述

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

让我们前进一步:

在此输入图像描述

reference1现在指着None.是的nil.该deinitmmethod没有被调用并打印它的消息.

让我们再向前迈进一步:

在此输入图像描述

现在reference1并且reference2都是预期的nil.println我添加的陈述被称为.但deinit没有跑,reference3不是nil.

下一步是完全退出方法.一旦我们退出该方法,变量就超出了范围而deinit被称为:

在此输入图像描述