objective c - Cómo propiedad mantener una referencia a los nodos hijos con ARC en Cocos2d
objective-c cocos2d-iphone (2)
Cambie su interfaz para usar una referencia débil de puesta a cero:
@interface MyNode : CCNode
@property (nonatomic, weak) CCNode *background;
@end
Si el nodo de fondo se desasigna, el _background ivar se volverá nil automáticamente. De esta forma ya no tendrás un ciclo de retención. En general, esto es una buena práctica si almacena una referencia de nodo en un nodo que es hijo o nieto del nodo porque esas situaciones siempre provocarán un ciclo de retención.
Su código tal como está debería funcionar bien con una referencia débil.
Sin embargo, tenga en cuenta que debe tener cuidado al crear y asignar a una referencia débil, por ejemplo, esto fallará si se agrega un nodo nil como secundario:
_background = [CCNode node];
[self addChild:_background];
El problema aquí es que después de la asignación, no hay nada fuertemente aferrado al nodo de fondo, por lo que se desasigna y se establece en nil antes de la línea addChild :.
Hay una solución simple:
CCNode* bg = [CCNode node];
[self addChild:bg];
_background = bg;
Después de que el nodo se haya agregado como secundario, la matriz de elementos secundarios tendrá una fuerte referencia al nodo. Entonces, después de la línea addChild: puede asignar el nodo bg temporal al _background ivar.
Tengo una clase CCNode
personalizada que tiene un grupo de nodos CCNode
, y quiero mantener referencias a los niños para hacer algunas transiciones personalizadas.
Por ejemplo, para el fondo secundario, la clase personalizada se vería así:
@interface MyNode : CCNode
@property (nonatomic, strong) CCNode *background;
@end
@implementation
- (void)setBackground:(CCNode *)background {
if (_background) {
[self removeChild:_background];
}
if (background) {
[self addChild:background];
}
_background = background;
}
- (void)runTransition {
if (_background)
[_background runAction:[…]];
}
@end
El problema es que esto provoca un ciclo de retención en ARC con el fondo del nodo nunca liberado de la memoria.
No hay reglas duras para la gestión de la memoria. Necesita ver su código y decidir cuál es el mejor método para usar.
Sin embargo, en su caso, ya que solo tiene un fondo, podría debilitar esa propiedad. Cocos2d contiene una fuerte referencia a todos los nodos que se encuentran en el gráfico de escena, por lo que se mantendrá.
Esto no significa que todos los nodos se deben almacenar como débiles, a veces se desea que el nodo permanezca si no está en el gráfico de escena.