Swift 软弱而无主的自我?

Swift 软弱而无主的自我?,swift,weak-references,retain-cycle,Swift,Weak References,Retain Cycle,我遇到了一些内存泄漏,这些泄漏似乎与捕获变量的闭包有关,而不一定是代码中众所周知的“自保留周期”。我的问题特别涉及SKAction运行块,例如 let initialBlock = SKAction.run { [unowned self] in emitter.position = self.circlesLayer.convert(circle.currentPosition, to: self) emitter.zPosition = 150 emitte

我遇到了一些内存泄漏,这些泄漏似乎与捕获变量的闭包有关,而不一定是代码中众所周知的“自保留周期”。我的问题特别涉及SKAction运行块,例如

let initialBlock = SKAction.run {
    [unowned self] in

    emitter.position = self.circlesLayer.convert(circle.currentPosition, to: self)
    emitter.zPosition = 150
    emitter.isPaused = true
    self.addChild(emitter)
}
这随后被用作:

run(SKAction.sequence([SKAction.wait(forDuration: 0.25), initialBlock, emitterStart, SKAction.wait(forDuration: 1.0), emitterStop]))
在这里,我在短暂延迟后添加一个发射器,取消暂停(emitterStart),等待,然后移除它(emitterStop)

为了进一步说明,将发射器声明为:

let emitter = Assets.sharedInstance.getEmitter(.specialcircleexplosion)
其中,资产是一个单体,当我将其预加载到游戏场景中时,它会拉入感兴趣的特定发射器

更详细地说(对不起),circle也是另一个类的实例。我是否也应该考虑[无主圈]

SKAction运行块中是否有任何原因指向[弱发射器]或[无主圆]以及[弱自我]或[无主自我]?这有点像双管齐下,但从更一般的意义上说:我应该关注除经典的弱自我情况之外的保留周期吗


一些额外的内存图信息,正如我在下面的Rob评论中提到的:

然而,以下是臭名昭著的结尾#3:

gameScene.animateMatchedCircles() {
    [weak self] in self?.animateMatchedCirclesCompletion()
}

那么你确定这就是导致持久强引用的闭包吗?“malloc堆栈”功能和“调试内存图”如果您还没有这样做,功能可以明确地识别这些问题的根源。对于最简单的情况,
initialBlock
本身是一个强属性吗?如果不是,您就不需要担心引用周期。为了回答这个问题,可以捕获另一个变量吗?管理它的适当方法是什么?我建议d您阅读了这一节是的,对。但是请看,
SKAction.run
是一个占用闭包的类型方法。在类型方法中引用
self
不一定会创建引用循环。为了创建循环,self还必须有一个对闭包的引用(对于
initialBlock
我想这不是您的情况)。否则就没有引用循环。您可能已经看到了
DispatchQue.main.async{self.doSomething()}
或甚至
UIView.animate…
事物。它们也不会创建引用循环。只要self不持有对该SKAction.seuence的引用(通过声明一个属性来持有该序列),就不可能存在潜在的引用循环。SKAction.run也是如此