【发布时间】:2014-11-20 16:25:54
【问题描述】:
这是我的测试代码(在终端中运行):
#!/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)
输出:
1
A deinit
0
如果上面提到的行被注释掉,则没有输出“A deinit”。输出将是:
1
1
我已经使用swiftc 编译了代码,但结果还是一样。 (xcrun swiftc -o test test.swift)
程序退出时标准输出将被关闭,或者对象在被破坏时仍然被引用(通过什么?)是设计使然吗?
更新:感谢@Logan,现在我有了更多关于它的详细信息。
当它在函数内部运行时,即使我注释掉a = nil,它也会输出A deinit:
#!/usr/bin/xcrun swift
class A {
deinit {
println("A deinit")
}
}
func test() {
var a: A? = A()
//a = nil
}
test()
我没有在 Xcode 中使用游乐场。 :-$
更新
#!/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 函数中运行。
【问题讨论】:
-
到底是什么问题?为什么输出是1,第一种情况下是1,为什么在函数中deinited?
-
@Rob Napier 是对的,您也可以将变量 a 放在大括号中以使用函数来更改范围。