только слабое и непривычное я? - PullRequest
0 голосов
/ 29 января 2019

Я столкнулся с некоторыми утечками памяти, которые, по-видимому, связаны с замыканиями, захватывающими переменные, которые не обязательно являются известными «циклами самосохранения» в моем коде.Мой вопрос, в частности, относится к блокам выполнения 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

Вот пресловутое закрытие # 3, однако:

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