这是我的测试代码(在终端中运行):
#!/usr/bin/xcrun swift
var count = 0; // for reference counting
class A {
init() {
count++;
}
deinit {
println("A deinit")
count--;
}
}
var a: A? = A()
println(count)
a = nil // no output if I comment out this statement
println(count)
Output:
1
A deinit
0
如果上述行被注释掉,则不会输出“A deinit”。输出将是:
1
1
我用过swiftc
编译代码,但结果仍然相同。 (xcrun swiftc -o test test.swift
)
程序退出时标准输出是否会被关闭,或者对象在被破坏时仍然被引用(通过什么?)?
更新:感谢@Logan,现在我有了更多关于它的细节。
当它在函数内运行时,它将输出A deinit
即使我评论掉a = nil
:
#!/usr/bin/xcrun swift
class A {
deinit {
println("A deinit")
}
}
func test() {
var a: A? = A()
//a = nil
}
test()
我没有在 Xcode 中使用 Playground。 :-$
Update
#!/usr/bin/xcrun swift
import Foundation
class A {
deinit {
var s = "A deinit"
println(s)
var a: A? = A()
a = nil
var error: NSError?
var path = "\(NSFileManager.defaultManager().currentDirectoryPath)/swift_test.txt"
if s.writeToFile(path, atomically: true, encoding: NSUTF8StringEncoding, error: &error) {
println("File saved at \(path)")
} else {
println(error)
}
}
}
//func test() {
var a: A? = A()
//}
//test()
结果:没有输出到标准输出或文件,除非在test
功能。