【发布时间】:2014-06-03 17:24:56
【问题描述】:
ARC 对象删除在 Swift Playground 中似乎不一致。这是一个错误还是设计使然?
考虑这个类:
class Test {
var name: String
init(name:String){
self.name = name
println("\(name) initialized")
}
deinit{
println("\(name) deinitialized")
}
}
当我从操场调用它时(不是命令行 REPL,请参阅下面的评论):
var t1 = Test(name: "t1")
var t2 : Test? = Test(name: "t2")
t2 = nil
我在控制台中只看到初始化消息:
t1 initialized
t2 initialized
缺少的是 t2 的 deinit。
当我在应用程序中运行它时(例如应用程序委托的条目),我的输出与 ARC 删除一致(即 t1 init,然后 t2,以及 t2 deinit 然后 t1,因为整个调用块超出了范围):
t1 initialized
t2 initialized
t2 deinitialized
t1 deinitialized
最后,在命令行 REPL(请参阅下面的评论以访问 REPL)中,结果是一致的,即:t1 由于其顶级范围而处于活动状态,但正如人们所期望的那样,t2 被 ARC 删除。
1> class Test {
2. var name: String
3. init(name:String){
4. self.name = name
5. println("\(name) initialized")
6. }
7. deinit{
8. println("\(name) deinitialized")
9. }
10. }
11> var t1 = Test(name: "t1")
t1 initialized
t1 initialized
t1 deinitialized
t1: Test = {
name = "t1"
}
12> var t2 : Test? = Test(name: "t2")
t2 initialized
t2 initialized
t2 deinitialized
t2: Test? = (name = "t2")
13> t2 = nil
t2 deinitialized
14> t1
$R2: Test = {
name = "t1"
}
15> t2
$R3: Test? = nil
【问题讨论】:
-
这是一个错误还是设计使然? 无法确定。如果你认为这是一个错误,你应该提交一份错误报告。但是由于操场本质上是交互式的,因此它可以保留任何创建的对象。更重要的是,不要期望 Playground 中对象的生命周期与应用中的生命周期完全匹配。
-
顺便说一句,Playground 和 REPL 不是一回事 - 您可以在调试时在 lldb 调试器提示符下输入“repl”,或者通过以下命令在命令行中输入“repl”: stackoverflow.com/a/24011715/59541
-
我有同样的问题,当我学习书中的语言时,无法在操场上测试对象取消初始化,悲伤但真实。