在下一段代码中,我尝试调用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.
6条答案
按热度按时间56lgkhnf1#
Xcode的
Playgrounds
for Swift不像普通应用程序那样工作;它们不会只运行一次。创建的对象会一直保存在内存中,直到你修改代码时才能被检查。修改代码时,整个过程都会被重新计算。当这种情况发生时,所有先前的结果都会被丢弃,而所有对象都将被释放,你不会看到任何输出。您的代码是正确的,但是Playgrounds不适合测试与内存管理相关的内容。
下面是一个相关的SO问题:Memory leaks in the swift playground / deinit{} not called consistently
xxslljrj2#
如果像这样创建对象,将调用Deinit
uklbhaso3#
当你像这样忽略变量时,就会调用Deinit。
所有者类别-
//打印-所有者已分配所有者已解除分配
kkih6yb84#
解决方法-将所有变量初始化代码移到一个函数中并调用该函数。
vaqhlq815#
显然,这行代码现在运行良好(07.02.2023)
flvlnr446#
Playground有问题曾经是一个问题。对于99%的内存管理案例来说,它们就像一个普通的项目一样工作。Playground随着时间的推移已经有了很大的改善。
这样的问题应该不再存在,Playground可以可靠地使用。