Я столкнулся с некоторыми утечками памяти, которые, по-видимому, связаны с замыканиями, захватывающими переменные, которые не обязательно являются известными «циклами самосохранения» в моем коде.Мой вопрос, в частности, относится к блокам выполнения 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)
, где Assets - это синглтон, который притягивает определенный интересующий излучатель, так как я предварительно загружаю их на игровую сцену.
Чтобы разработать ДАЖЕ ДАЛЕЕ (извините), круг также является экземпляром другого класса.Должен ли я также подумать о [неизвестном круге]?
Есть ли какая-либо причина в блоке пробега SKAction для [слабого излучателя] или [неизвестного круга], а также для [слабого я] или [неизвестного я]?Это немного двузначно, но в более общем смысле: должен ли я следить за циклами сохранения, отличными от классического случая слабой самости?
Некоторая дополнительная информация о графике памяти, как я упоминал вкомментарии к Робу ниже:
![retain cycle shown here](https://i.stack.imgur.com/rs0N3.png)
Вот пресловутое закрытие # 3, однако:
gameScene.animateMatchedCircles() {
[weak self] in self?.animateMatchedCirclesCompletion()
}