【发布时间】:2019-12-15 13:04:47
【问题描述】:
让我先声明我已经阅读了this other question 和documentation for ARC 中的所有内容。
我正在尝试使用 RAII 成语来处理问题,但遇到了一些不一致的问题,导致它无法正常工作。
这是一个演示不一致的示例:
class TestClass {
init() {
print("init")
}
deinit {
print("deinit")
}
}
func test() {
TestClass()
defer { print("defer") }
print("end of scope")
}
test()
根据我的 c++ 经验,我希望 TestClass 实例的 deinit 发生在 test 函数范围的末尾,这就是我想要做的事情的行为。
同时我意识到我正在初始化TestClass 的一个实例,但没有将它存储在变量中,因此没有对它的强引用,因此立即释放它是有意义的。
所以问题和疑问出现了,因为这种行为在项目和游乐场之间不一致。
在操场上,上面的代码产生以下输出:
init
end of scope
defer
deinit // deinit happens at end of scope
after scope
但在一个项目中,完全相同的代码会产生不同的结果:
init
deinit // deinit happens immediately
end of scope
defer
after scope
所以
- 为什么这在项目和游乐场之间表现不同?
- 有没有办法控制/保证项目中使用的行为?如果可能的话,我想要游乐场的行为。
【问题讨论】:
标签: swift xcode swift-playground