我目前正在关注 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
:
然后在 reference1
初始化之后呢?
好的,让我们跳到 reference2
和 reference3
设置之后:
所有三个变量都指向相同的内存位置,我们可以看到初始化程序只运行了一次。这些都指向同一个位置。
让我们向前走:
reference1
现在指向 None
。它是 nil
。 deinit
mmethod 尚未被调用并打印其消息。
让我们更进一步:
现在 reference1
和 reference2
都应该是 nil
。调用了我添加的 println
语句。但是 deinit
没有运行并且 reference3
不是 nil
。
下一步是逐步退出方法。一旦我们离开方法,变量就超出范围并且调用 deinit
:
关于swift - ARC(自动引用计数)实战,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30457328/