22

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

4 回答 4

26

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

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

这是一个相关的 SO 问题:swift playground / deinit{} 中的内存泄漏没有一致地调用

于 2014-06-23T10:32:22.723 回答
6

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

_ = Person(name:"Mark")
于 2018-01-30T04:52:59.437 回答
0

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

// 打印 - 所有者被分配 所有者被解除分配

于 2020-01-16T13:29:52.400 回答
-1

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

这样的问题应该不再存在,并且可以可靠地使用 Playground。

于 2020-10-21T13:23:40.437 回答