我的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")
我在一个独立的二进制文件中运行它(因为apparently the playground has issues with deinit)并禁用了优化,使用Xcode6-Beta3:
> 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
请注意缺少的 Global已被取消初始化。
我甚至无法弄清楚这是预期的行为还是错误,所以如果是前者,那么对相关法律术语的引用将会受到赞赏。
答案 0 :(得分:4)
它对我来说很好......在结束应用程序时,没有任何内容被释放 - 没有任何意义
deinit只是为了释放记忆并删除观察者和东西 - 在结束这个过程时,这有点“无用”'因为过程记忆将被擦除'反正强>
==>
SO:
除了内存管理/观察者相关的东西之外什么也没有放入
如果您需要专门的停止方法 - 在退出流程之前写一个并明确调用它
答案 1 :(得分:4)
将最后一行代码视为:
var personp: Person? = Person(name: "Optional Global")
personp = nil
var person = Person(name: "Global")
exit(0)
由于person
永远不会设置为其他值,因此ARC在退出之前永远不会减少保留计数。
Swift的工作方式就像执行C程序一样,只需终止,然后在一次扫描中返回分配给进程的所有内存。
这与执行内存处理非常不同,执行内存处理依赖于进程内事件来释放内存。由于程序的所有执行都已完全停止,因此没有线程可以运行deinit
。
总而言之,这是应该的。