【问题标题】:Deinit method is never called - Swift playgroundDeinit 方法永远不会被调用 - Swift Playground
【发布时间】:2014-08-13 08:14:26
【问题描述】:

在接下来的代码中,我尝试调用 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 !

标签: swift memory-management swift-playground


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

    当您像这样忽略变量时,会调用 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")
        }
    }
    

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

    【讨论】:

      【解决方案3】:

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

      _ = Person(name:"Mark")
      

      【讨论】:

        【解决方案4】:

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

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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多