【发布时间】:2014-07-12 04:13:12
【问题描述】:
我的 Swift 全局变量没有被取消初始化。
class Person {
let name: String
init(name: String) {
self.name = name
println("\(name) is being initialized")
}
deinit {
println("\(name) is being deinitialized")
}
}
func local() {
let person = Person(name: "Local")
}
local()
var personp: Person? = Person(name: "Optional Global")
personp = nil
var person = Person(name: "Global")
我使用 Xcode6-Beta3 在禁用优化的独立二进制文件中运行它(因为 apparently the playground has issues with deinit):
> xcrun swift -O0 arc.swift && ./arc
Local is being initialized
Local is being deinitialized
Optional Global is being initialized
Optional Global is being deinitialized
Global is being initialized
请注意缺少的全局正在被取消初始化。
我什至无法弄清楚这是预期的行为还是错误,所以如果是前者,那么对相关法律术语的引用将不胜感激。
【问题讨论】:
-
为什么要重新初始化全局?它实际上是一个属性,不是吗?
-
当前的两个答案都提到,鉴于底层实现,这并非完全出乎意料。正如我在问题中所说,如果是这种情况,那么我希望得到更明确的引用。这是一个问题的原因是全局可能正在跟踪某种资源(文件、数据库连接等),并且鉴于当前的行为,程序员有责任确保不保留这样的“资源所有者”作为全球性的。