objective c - Los pools de SKSpriteNode en iOS 8 parecen estar asignados a la superposición de memoria
objective-c cocoa-touch (1)
Me podría estar perdiendo algo. Pero mi aplicación actual en la tienda de aplicaciones funciona en iOS 7, pero en iOS 8 falla completamente porque no creará un grupo de sprites preasignados. Aparecen escritos en la misma dirección a menos que los sprites tengan propiedades específicamente diferentes.
En iOS 7, el siguiente código produce un conjunto con 4 objetos únicos. En iOS 8, el mismo código produce un conjunto con solo 1 objeto:
NSMutableSet *aSet = [NSMutableSet set];
SKColor *sameColor = [SKColor redColor];
CGSize sameSize = CGSizeMake(10, 10);
for (int i = 0; i < 4; i++) {
//allocate a brand new sprite
SKSpriteNode *thisSprite1 = [[SKSpriteNode alloc] initWithColor:sameColor size:sameSize];
[aSet addObject:thisSprite1];
}
NSLog(@"aSet Count: %i", aSet.count);
Resultado iOS8:
2014-09-09 15: 06: 43.065 MSM [383: 27490] aSet Count: 1
¿Me estoy volviendo loco? Sorprendentemente, casi toda mi aplicación se basa en este concepto de código que se repite una y otra vez. Si hago lo mismo, pero uso algo como NSObject
, entonces el problema desaparece, por lo que parece ser un nuevo cambio en SKSprite
. Sé que puedo solucionarlo con algunas cosas locas, pero es un gran dolor, ya que no debería tener que hacer eso, y esperaba evitar otra presentación de la versión.
Gracias a Josh por la dirección sobre cómo resolver este nuevo bache en la carretera.
Subclasé SKSpriteNode, anulando -isEqual y -hash, para ser lo que mi mejor conjetura es la implementación de NSObject. Luego hice un Find / Replace All in Project para "SKSpriteNode" para el nombre de mi subclase, y todo está de regreso en la versión iOS 7:
-(BOOL)isEqual:(id)object{
return self == object;
}
- (NSUInteger)hash
{
return (NSUInteger)self;
}