内存泄漏在swift playground / deinit {}中没有被一致地调用

ARC对象的删除似乎在Swift Playground中是不一致的。 这是一个错误还是devise?

考虑这个类:

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 

缺less的是t2的缺失。

当我在一个应用程序(例如,应用程序委托项)中运行它时,输出与ARC删除一致(即t1 init,t2和t2 deinit,然后t1,因为整个调用块超出范围):

 t1 initialized t2 initialized t2 deinitialized t1 deinitialized 

最后,在命令行REPL(请参阅下面有关访问REPL的注释)中,结果是一致的,即:t1由于其顶级作用域而处于活动状态,但t2被删除,正如人们所期望的那样。

  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内比较ARC /删除异议。 我们的testing代码使用在特定范围内和外部创build的对象。 我们还嵌套了testing器对象以testing多嵌套范围。

我们看到,应用场景删除线索上的对象(第零个参考),而Playground场景删除了一些,但对大多数对象(不考虑范围,但在多次运行中显然是一致的)持有大部分对象。

游乐场可能会保留对象以便为其辅助GUI输出(和/或其回放function)提供服务。

在这里看博客文章。

我发现我可以在操场(Xcode版本6.0(6A313))中触发对deinit {}的调用,方法是添加一个可选的外层:

 struct MetaTest { var t3: Test? = Test(name: "t3") } var mt3: MetaTest? = MetaTest() mt3!.t3 = nil 

它创build这个输出:

 t3 initialized t3 deinitialized