Это действие 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
строго упоминается в другом месте программы, как дочерний элемент другого node. Поэтому я не понимаю, как нарушается ссылка [unowned self]
. Он не должен быть освобожден.
Я попытался реплицировать эту проблему за пределами SpriteKit с помощью dispatch_after()
, но я не смог.