快速取消全球化

时间:2014-07-12 04:13:12

标签: ios swift

我的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已被取消初始化

我甚至无法弄清楚这是预期的行为还是错误,所以如果是前者,那么对相关法律术语的引用将会受到赞赏。

2 个答案:

答案 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

总而言之,这是应该的。