Tengo un problema con un objeto Objective-C (en una aplicación de juegos de iOS) que está misteriosamente desasignado.¿Por qué mi objeto Objective-C está desasignado?
El objeto es una instancia de GameCharacter que se crea una instancia de esta manera:
for (int c = 0; c < kNrOfGuards; c++) {
GameCharacter* guard = [[GameCharacter alloc] initGuard:self sprite:guardSprite];
[characterArray addObject:guard];
[guard release];
}
También tengo un método de conveniencia para encontrar un GameCharacter:
- (GameCharacter*)findCharacterWithIndex:(int)index {
return [characterArray objectAtIndex:index];
}
Y el código que genera el error parece :
for (int c = 0; c < [self characterCount]; c++) {
GameCharacter* tempCharacter = [self findCharacterWithIndex:c];
if (tempCharacter.playerId == playerIndex]) {
...
}
}
Ejecutando este código para som tiempo e (nunca inmediatamente) genera un error en la consola:
[GameCharacter playerId]: mensaje enviado a la instancia desasignado 0x4e47560
Con la NSZombieEnabled trick He conseguido localizar el objeto (s) Eso está causando el problema, pero todavía no puedo entender por qué este objeto está siendo desasignado. Buscar en mi código para "release"/"dealloc" no produce ninguna pista.
He intentado eliminar el "lanzamiento" (e incluso agregar un "retener") al ciclo alloc/init (ver arriba), parece extender el tiempo de ejecución de la aplicación pero no eliminar completamente el problema .
¡Cualquier sugerencia sería muy apreciada!
EDITAR
Gracias a quixoto, Olie, Eiko, tc., He descubierto que es mi objeto GameCharacter que se cancela la asignación, pero yo todavía no entiendo muy bien por qué. Aquí está el registro de seguimiento en orden cronológico inverso:
#0 -[GameCharacter dealloc]
#1 objc_setProperty
#2 -[TiledGroundLayer setSelectedCharacter:]
#3 -[TiledGroundLayer selectNextCharacterForPlayer:searchStep:]
#4 -[GameScene selectNextCharacter:]
#5 -[GameScene endTurn]
#6 -[HUDLayer onClickDone:]
¿Qué ocurre aquí, es que el usuario hace clic en "Done", se cambia el carácter seleccionado en la pantalla y por lo tanto la propiedad selectedCharacter
en TiledGroundLayer (paso # 2-4) Como selectedCharacter
posee el objeto GameCharacter anterior, parece que se está desasignando. ¿Pero por qué no está siendo retenido correctamente por NSMutableArray ([characterArray addObject:guard];
)?
¿Su variable characterArray fue creada como '[NSMutableArray array]' o '[[NSMutableArray init] alloc]'? – tidwall
@Tom: ¿en qué clases viven estos fragmentos de código? Parece que tienes un código en otro lugar que interactúa con el characterArray que da como resultado el dealloc. Podría asociarse con la eliminación del objeto de la matriz, por ejemplo, ¿eso sucede? –
Miraría cuidadosamente characterArray y cuando se desasignara. Como tiene una función de conveniencia para devolver un guardia, podría sostenerlo fácilmente después de que characterArray y todos sus contenidos se desasignaran.Si no tiene el método de conveniencia (y no puedo ver su beneficio aquí), en lugar de eso, puede simplemente tomar el protector de la matriz cada vez que lo necesite y estar más seguro de que characterArray aún era necesario y válido en ese punto. –