2009-01-27 7 views
5

Je suis confronté à ce problème de libération d'un objet déjà publié, mais je ne peux pas, pour la vie de moi, savoir où l'erreur se produit. J'ai ajouté le drapeau NSZombieEnabled et c'est le journal que j'obtiens dans gdb. Quelqu'un peut-il me dire comment résoudre ce problème ou plutôt découvrir où l'erreur s'est produite?Développement de l'iPhone - problème de sortie de mémoire

*** -[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 

Merci.

Répondre

16

Le pool de libération automatique tente de libérer un objet déjà libéré.

Cela peut se produire si vous relâchez manuellement un objet enregistré pour autorelease

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

Vous pouvez utiliser la méthode suivante pour trouver le point d'attribution:

  1. Set MallocStackLogging, MallocStackLoggingNoCompact environnements à 1.
  2. Exécutez le programme et une fois qu'il se casse en gdb, utilisez malloc_history à partir du shell pour connaître la trace de la pile de l'allocation: malloc_history <pid> <addr>. (NSZombieEnabled affichera l'adresse dans gdb)

Une autre option (qui risque moins de ralentir les performances d'exécution) consiste à utiliser l'outil Instruments avec le modèle "Zombies". Il va suivre les zombies et aussi vous raconter l'histoire d'un zombie sans avoir à utiliser la commande malloc_history.

+0

Merci. Je suis retourné à travers les documents de gestion de la mémoire. J'essayais de libérer un objet qui était utilisé par un autre objet. – lostInTransit

Questions connexes