War*_*ple 12 closures sprite-kit swift
通过完成闭包调用自身来重复此SpriteKit操作.它使用闭包而不是a 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(),但我无法做到.
Ten*_*Jay 18
如果封闭使用自我可能是零[弱自我].
如果自我永远不会在闭包中使用[无主自我].
如果你在使用[无主自我]时崩溃,那么在封闭的某个时刻self可能是零,所以你需要使用[弱自我].
文档中的示例非常适合在闭包中使用strong,weak和unowned:
https://docs.swift.org/swift-book/LanguageGuide/AutomaticReferenceCounting.html
这听起来像个错误.{[unowned self] in self.twinkle()}应该相同的工作{[weak self] in self!.twinkle()}
我最近遇到了类似的崩溃.在我的情况下,有时新对象的初始化恰好与解除分配的对象具有完全相同的内存地址.但是,如果两个对象具有不同的内存地址,则代码将执行得很好.
所以这是我疯狂的解释.当swift将强引用置于闭包并检查其捕获列表时,如果捕获列表中的变量显示为"unowned",它将检查对象是否已被释放.如果对象被标记为"弱",它不会检查.
由于保证对象在闭包中永远不会是零,因此它实际上永远不会崩溃.
所以,可能是语言错误.我对此的看法是使用弱而不是无主.
| 归档时间: | 
 | 
| 查看次数: | 7939 次 | 
| 最近记录: |