【发布时间】:2014-06-25 17:27:46
【问题描述】:
这个 SpriteKit 动作通过使用完成闭包调用自身来重复。它使用闭包,而不是SKAction.repeatActionForever(),因为它需要在每次重复时生成一个随机变量:
class Twinkler: SKSpriteNode {
init() {
super.init(texture:nil, color:UIColor.whiteColor(), size:CGSize(width:10.0, height:10.0))
twinkle()
}
func twinkle() {
let rand0to1 = CGFloat(arc4random()) / CGFloat(UINT32_MAX)
let action = SKAction.fadeAlphaTo(rand0to1, duration:0.1)
let closure = {self.twinkle()}
runAction(action, completion:closure)
}
}
我想我应该使用[unowned self] 来避免闭包的强引用循环。当我这样做时:
let closure = {[unowned self] in self.twinkle()}
它因错误而崩溃:_swift_abortRetainUnowned。但如果我改用[weak self]:
let closure = {[weak self] in self!.twinkle()}
它执行没有错误。为什么[weak self] 工作但[unowned self] 中断?我什至应该在这里使用其中任何一个吗?
Twinkler 对象在程序的其他地方被强烈引用,作为另一个节点的子节点。所以我不明白[unowned self] 参考是如何破坏的。它不应该被释放。
我尝试使用 dispatch_after() 在 SpriteKit 之外复制此问题,但我无法做到。
【问题讨论】:
-
在 iOS 9.1 上,即使闭包本身没有执行,我也能够重现崩溃。不确定这是否是一个错误,因为它不会发生在 iOS 9.3 stackoverflow.com/a/36274194/3402095
标签: closures swift sprite-kit