Swift SpriteKit ARC para maniquíes

He estado tratando de entender mis fuertes ciclos de referencia y estoy luchando. He estado leyendo la documentación de Apple y en algún sitio web y siento que realmente no abordan mis problemas.

Entiendo que tienes que usar débil y sin propiedad dependiendo de si el objeto puede ser nulo o no. Entonces digamos que tienes 2 clases como esta

class Person {
   var dog: Dog?
  ....
}

class Dog {
  weak var person: Person?
}

que se refieren entre sí Sé que uno de ellos tiene que usar débil / sin dueño. Este es el ejemplo clásico visto en la mayoría de los tutoriales.

También he visto ejemplos como este y también tienen sentido para mí.

class Person {

 unowned let gameScene: GameScene

 init(scene: GameScene) {
   self.gameScene = scene 
  ....
 }

También entiendo que los NSTimers pueden causar fuertes ciclos de referencia si no se invalidan. No estoy usando NSTimers, así que esto no debería ser un problema.

Además, entiendo que los protocolos también pueden causar pérdidas de memoria, por lo que la forma de manejarlos sería convertirlo en un protocolo de clase

protocol TestDelegate: class { }

y donde estoy tratando de hacer referencia al protocolo lo hago una propiedad débil

 class: SomeClass {

  weak var myDelegate: TestDelegate?

 }

Y finalmente sé sobre cierres donde me estoy capturando así

SKAction.runBlock { [unowned self] in
   self.player.runAction....
}

Sin embargo, cuando se trata de mi juego de spritekit real, parece que tengo ciclos de referencia por todas partes, incluso para clases simples, estoy seguro de que no hago referencia a otra clase, y no entiendo por qué.

Entonces mis preguntas principales son

1) ¿Todas las propiedades crean fuertes ciclos de referencia o solo propiedades globales que se crean antes de que se inicialice una clase?

2) ¿Qué otras cosas podrían crear un ciclo de referencia fuerte en mis clases simples?

Por ejemplo, estoy usando una clase que crea plataformas

class Platform: SKSpriteNode {

 /// basic code to create platforms 
 /// some simple methods to rotate platforms, move them left or right with SKActions.

Ahora tengo clases similares como esta para Trampas, Enemigos, etc. Nuevamente, normalmente solo establecen las propiedades del sprite (cuerpo físico, etc.) y tienen algunos métodos para animarlas o rotarlas. No hay nada lujoso en ellos, especialmente en lo que respecta a hacer referencia a otras clases o escenas.

En mi gameScene tengo un método para crear plataformas (sería lo mismo para enemigos, trampas, etc.)

func createPlatform() {

 let platform1 = Platform(.....
 platformNode.addChild(platform1)

 let platform2 = Platform(....
 platformNode.addChild(platform2)

 let platform3 = Platform(...
 platformNode.addChild(platform3)

 // platform node is just a SKNode in the gameScene to help maintain the difference zPositions of my objects.

}

Cuando ejecuto asignaciones, puedo ver que solo 1 de las 3 plataformas pasa a estado transitorio, 2 permanecen persistentes cuando cambio a mi menuScene. Lo extraño es que siempre solo se elimina 1, no importa si cambio el orden o creo / elimino algunas plataformas. Por lo tanto, parece que están creando referencias fuertes, excepto 1. Entonces, si reproduzco mi nivel varias veces, puedo tener rápidamente 50-100 plataformas persistentes en la memoria. Por lo tanto, mi escena tampoco se deinita, lo que desperdicia más memoria.

Otro ejemplo que tengo es

class Flag {
  let post: SKSpriteNode
  let flag: SKSpriteNode

  init(postImage: String, flagImage: String) {

       post = SKSpriteNode(imageNamed: postImage)
       ...


       flag = SKSpriteNode(imageNamed: flagImage)
       ...
       post.addChild(flag)
  }
}

y el mismo problema Creo algunas banderas en mis escenas y, a veces, una bandera no se elimina, a veces sí. Nuevamente, esta clase no hace referencia a ninguna escena o clase personalizada, simplemente crea un sprite y lo anima.

En mi escena tengo una propiedad global para bandera

 class GameScene: SKScene {

   var flag: Flag!

  func didMoveToView... 

 }

¿Por qué esto crearía una referencia fuerte si la propia bandera no hace referencia a GameScene? Además no puedo usar

weak var flag: Flag!

porque me cuelgo una vez que la bandera se inicializa.

¿Hay algo obvio que me falta al hacer esto? ¿Hay algún buen truco para encontrarlos en Instrumentos porque me parece una locura? Es confuso para mí principalmente porque mis clases son bastante simples y no hacen referencia a otras clases personalizadas, escenas, controles de vista, etc.

Respuestas a la pregunta(2)

Su respuesta a la pregunta