永远不会调用 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 的正确位置?