永远不会调用 Deinit 方法 - Swift Playground

Posted

技术标签:

【中文标题】永远不会调用 Deinit 方法 - Swift Playground【英文标题】:Deinit method is never called - Swift playground 【发布时间】:2014-06-23 10:13:13 【问题描述】:

在下一个代码中,我尝试调用 deinit 方法,释放对 Person Class 实例 Mark 的所有引用,但从未调用 deinit。为什么?

class Person

    let name:String

    init(name:String)
        self.name = name
        println("Person created")
    

    deinit 

        println("Person \(name) deinit")
    


var Mark:Person? = Person(name:"Mark")
Mark = nil // Shouldn't the person deinit method be called here? It doesn't.

【问题讨论】:

deinit 正在调用相同的代码。 可能这是 Playgrounds 的问题,我离开了 Playgrounds 测试以获得更稳定的 Xcode 版本。你可以检查一下代码,deinit 被正确调用了。 无法在操场上测试 ARC! 在 XCode 10 中调用 deinit ! 【参考方案1】:

Xcode 的 Swift 的 Playgrounds 不像普通应用程序那样工作;它们不会只运行一次。创建的对象保留在内存中并且可以检查,直到您更改代码,此时重新评估整个 Playground。发生这种情况时,所有先前的结果都将被丢弃,并且所有对象都将被释放,但您不会看到任何输出。

您的代码是正确的,但 Playgrounds 不适合测试与内存管理相关的内容。

这是一个相关的 SO 问题:Memory leaks in the swift playground / deinit not called consistently

【讨论】:

【参考方案2】:

如果创建这样的对象,将调用 Deinit

_ = Person(name:"Mark")

【讨论】:

【参考方案3】:

当您像这样忽略变量时,会调用 Deinit。

import PlaygroundSupport
PlaygroundPage.current.needsIndefiniteExecution = true
_ = Owner()
PlaygroundPage.current.finishExecution()

所有者类 -

public class Owner 
    public var car: Car?
    public init (_ car: Car? = nil) 
        self.car = car
        print ("Owner got allocated")
    

    deinit 
        print ("owner got deallocated")
    

// 打印 - 业主已分配 所有者被释放

【讨论】:

【参考方案4】:

游乐场有问题曾经是个问题。对于 99% 的内存管理案例,它们的工作方式与普通项目一样。随着时间的推移,Playground 有了很大的改进。

这样的问题应该不存在了,Playground可以可靠使用了。

【讨论】:

以上是关于永远不会调用 Deinit 方法 - Swift Playground的主要内容,如果未能解决你的问题,请参考以下文章

Swift:rootViewController 永远不会调用它的视图 [Will/Did]Disappear 方法

xmppStreamDidConnect 永远不会在 Swift 中被调用

swift playground / deinit 中的内存泄漏未一致调用

为 NSNotificationCenter = Swift deinit() 调用 .removeObserver 的正确位置?

没有在 UIViewController 上调用 Deinit,但 Dealloc 是

调用了 Deinit 但对象仍在内存中