2009-01-27 10 views
5

Me estoy encontrando con este problema de liberación de un objeto ya lanzado pero no puedo saber dónde está ocurriendo el error. He agregado el flag NSZombieEnabled y este es el log que obtengo en gdb. ¿Puede alguien decirme cómo resolver este problema o averiguar dónde se produjo el error?Desarrollo de iPhone - problema de liberación de memoria

*** -[CFString release]: message sent to deallocated instance 0x5e4780 
(gdb) where 
#0 0x952ff907 in ___forwarding___() 
#1 0x952ffa12 in __forwarding_prep_0___() 
#2 0x9260e20f in NSPopAutoreleasePool() 
#3 0x30a564b0 in _UIApplicationHandleEvent() 
#4 0x31563dea in SendEvent() 
#5 0x3156640c in PurpleEventTimerCallBack() 
#6 0x95280615 in CFRunLoopRunSpecific() 
#7 0x95280cf8 in CFRunLoopRunInMode() 
#8 0x31564600 in GSEventRunModal() 
#9 0x315646c5 in GSEventRun() 
#10 0x30a4ec98 in -[UIApplication _run]() 
#11 0x30a5a094 in UIApplicationMain() 
#12 0x00002494 in main (argc=1, argv=0xbfffef9c) at /Users/adminUser/Projects/MyProject/main.m:14 

Thanks.

Respuesta

16

El grupo de liberación automática está intentando liberar un objeto que ya se lanzó.

Esto puede suceder si se suelta manualmente un objeto registrado para autorelease

NSString* foo = [NSString stringWithFormat:@"foo:%d",42]; 
[foo release]; /* this release is bad, as this object is already 
registered for autorelease */ 

Se puede utilizar el siguiente método, para encontrar el momento de la asignación:

  1. Conjunto MallocStackLogging, MallocStackLoggingNoCompact ambientes a 1.
  2. Ejecute el programa y una vez que se rompa en gdb use malloc_history desde el shell para averiguar el seguimiento de la pila de la asignación: malloc_history <pid> <addr>. (NSZombieEnabled imprimirá la dirección en GDB)

Otra opción (que es menos probable que ralentizar el rendimiento de ejecución) es utilizar la herramienta de instrumentos con la plantilla "Zombies". Seguirá a los zombies y también te contará la historia de un zombie sin tener que usar el comando malloc_history.

+0

Gracias. Pasé nuevamente por los documentos de administración de memoria. Estaba intentando liberar un objeto que estaba siendo utilizado por otro objeto. – lostInTransit

Cuestiones relacionadas