快速取消全球化

Man*_*nav 5 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")
Run Code Online (Sandbox Code Playgroud)

我使用Xcode6-Beta3 在一个独立的二进制文件中运行它(因为显然游乐场有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
Run Code Online (Sandbox Code Playgroud)

请注意,缺少的Global正在被取消初始化.

我甚至无法弄清楚这是预期的行为还是一个错误,所以如果它是前者,那么对相关法律术语的引用将不胜感激.

Dai*_*jan 5

对我来说看起来不错......在结束应用程序时没有任何内容被释放 - 没有意义


deinit 只是为了释放内存并删除观察者和其他东西 - 但是在结束进程时,这有点“无用”,因为无论如何进程内存“都会被擦除”

==>

所以:

除了内存管理/观察者相关的东西外,不要在 deinit 中放入任何东西

如果您需要专用的停止方法 - 编写一个并在退出进程之前显式调用它


Nuo*_*oji 5

将最后一行代码视为:

var personp: Person? = Person(name: "Optional Global")
personp = nil

var person = Person(name: "Global")

exit(0)
Run Code Online (Sandbox Code Playgroud)

由于person从未设置为其他值,因此 ARC 不会在退出前减少保留计数。

Swift 的工作方式与 C 程序类似,执行只是终止,然后分配给该进程的所有内存都会一次性返回。

这与执行中内存处理非常不同,后者依赖进程内事件来释放内存。由于程序的所有执行都已完全停止,因此没有线程来运行deinit.

所以总而言之,这是应该的。