这个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]
引用会出现问题。它不应该被释放。
我尝试在SpriteKit之外使用dispatch_after()
复制这个问题,但我失败了。