获取精灵在removefromParent之后从场景中删除时发出消息?

Ste*_*ves 5 sprite-kit swift

在Swift中有什么方法可以告诉我什么时候SKSpriteNode已经从场景中删除了?我不认为它实际上是在removeFromParent调用时完成的,但我认为它是在以后完成的,当时Sprite-Kit认为这样做很方便.

我正在尝试了解整个生命周期,我注意到didBeginContact即使在精灵被移除后,精灵仍然可能涉及接触和碰撞.

如果我打印出内容children(即包含场景中所有子节点的数组),我看到removeFromParent调用时精灵被删除,但精灵仍然可用(至少,对于SK游戏循环的执行) .

编辑:这个问题来自我之前的一个问题,即关于didBeginContact一次接触被多次调用(Sprite-Kit为单次接触注册多次碰撞)并发现在第一次接触期间移除精灵并未阻止后续接触.(因为SK事先已经"联系"了联系人.)所以我想知道精灵什么时候被删除了.

Ste*_*ves 2

我错过了显而易见的事情吗?所以即使removeFromParent精灵仍然存在。但是,很可能是因为我已将节点分配给临时SKSpriteNode变量,那么只要该变量存在,就存在对该节点的强引用,因此它不会被释放。此外,SKPhysicsContact对象本身将保留对物理主体的引用,该引用具有对节点的引用,我认为这也会阻止分配。

更新

要查看精灵何时实际释放,请使用以下deinit()方法:

deinit {
    print("Invader of type \(type) deinitialised")
}
Run Code Online (Sandbox Code Playgroud)

我认为这只能添加在子类定义中,而不能通过扩展添加。

拥有对要删除的节点具有强引用的变量将阻止该节点被解除分配,直到该变量本身被删除或更改为引用其他内容。