从未调用Deinit方法- SwiftPlayground

osh3o9ms  于 2023-02-11  发布在  Swift
关注(0)|答案(6)|浏览(123)

在下一段代码中,我尝试调用deinit方法,释放所有对Person Class示例的引用,但是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.
56lgkhnf

56lgkhnf1#

Xcode的Playgrounds for Swift不像普通应用程序那样工作;它们不会只运行一次。创建的对象会一直保存在内存中,直到你修改代码时才能被检查。修改代码时,整个过程都会被重新计算。当这种情况发生时,所有先前的结果都会被丢弃,而所有对象都将被释放,你不会看到任何输出。
您的代码是正确的,但是Playgrounds不适合测试与内存管理相关的内容。
下面是一个相关的SO问题:Memory leaks in the swift playground / deinit{} not called consistently

xxslljrj

xxslljrj2#

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

_ = Person(name:"Mark")
uklbhaso

uklbhaso3#

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

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

kkih6yb8

kkih6yb84#

解决方法-将所有变量初始化代码移到一个函数中并调用该函数。

vaqhlq81

vaqhlq815#

显然,这行代码现在运行良好(07.02.2023)

flvlnr44

flvlnr446#

Playground有问题曾经是一个问题。对于99%的内存管理案例来说,它们就像一个普通的项目一样工作。Playground随着时间的推移已经有了很大的改善。
这样的问题应该不再存在,Playground可以可靠地使用。

相关问题