2009-05-08 4 views
0

J'écris une simple application ObjC2.0/cacao, et je reçois un accident .. Ne connaissant pas de cacao ou ObjC, je ne peux pas comprendre pourquoi. .accident lié à la mémoire avec l'ajout d'objets à NSArrayController

le code origine des problèmes est TableListCon.m

Lorsque je fais glisser un dossier sur le NSTableView, il appelle addDirectoryToList - qui fait une boucle récursive sur tous les fichiers contenus dans ce répertoire, appelant addFileToList sur chacun.

Lorsque je fais glisser un fichier sur le tableview, il appelle directement addFileToList. Cela fonctionne correctement, mais dans la console Debugger il affiche le message suivant:

tvnamergui(2612) malloc: *** error for object 0x144ab0: double free 
*** set a breakpoint in malloc_error_break to debug 

Ou, si je fais glisser-déposer un dossier il n'y a pas de tels messages, et il tombe directement à GDB, avec le backtrace suivant:

(gdb) bt 
#0 0x95cee688 in objc_msgSend() 
#1 0x921e2e4f in NSPopAutoreleasePool() 
#2 0x917b4b10 in NSCoreDragReceiveProc() 
#3 0x95f9e1b0 in DoDropMessage() 
#4 0x95f9dc11 in CoreDragMessageHandler() 
#5 0x960f0d21 in __CFMessagePortPerform() 
#6 0x961128e8 in CFRunLoopRunSpecific() 
#7 0x96112cd8 in CFRunLoopRunInMode() 
#8 0x924892c0 in RunCurrentEventLoopInMode() 
#9 0x92489012 in ReceiveNextEventCommon() 
#10 0x92488f4d in BlockUntilNextEventMatchingListInMode() 
#11 0x914e0d7d in _DPSNextEvent() 
#12 0x914e0630 in -[NSApplication nextEventMatchingMask:untilDate:inMode:dequeue:]() 
#13 0x914d966b in -[NSApplication run]() 
#14 0x914a68a4 in NSApplicationMain() 
#15 0x000022a0 in main (argc=1, argv=0xbffff74c) at /Users/dbr/Desktop/tvnamergui/main.m:13 

Plus étrange encore, si je fais glisser un seul fichier d'abord, je reçois l'erreur double free, mais je peux déposer des dossiers sur les sans accidents (et tous fonctionne parfaitement)

Il meurt toujours quand [ArrayCon addObject:cfile]; est exécuté (En commentant cette ligne arrête le crash, mais casse évidemment la fonctionnalité)

Modifier: Merci à smorgan's answer (à l'aide NSZombieEnabled), j'ai un message d'erreur plus utile:

*** -[CFArray release]: message sent to deallocated instance 0x155a70 
+0

Le lien vers TableListCon.m est rompu. –

+0

C'était étrange, il semblait que stackoverflow avait encodé en url le trait de soulignement (dans le nom du projet), semble fonctionner après une modification, merci de le signaler – dbr

+0

Lien encore cassé. – EightyEight

Répondre

3

Bien que je ne peux pas donner une réponse spécifique pour votre cas , la meilleure façon de déboguer des plantages de version supérieure est turn on NSZombieEnabled afin que vous puissiez facilement voir quel objet est en cours de relâchement. Editer: Après avoir regardé autour de votre projet, je crois que votre problème est réellement dans l'initialiseur AppCon. Vous définissez votre variable membre "theFiles" sur un tableau autoreleased, et pendant que vous utilisez une propriété de retenue (well, copying), vous ne la définissez pas avec la syntaxe de propriété (self.theFiles = ...), donc vous êtes contournant le setter généré automatiquement qui gérerait correctement la gestion de la mémoire. Lorsque quelque chose tente de mettre à jour cette propriété ultérieurement, il essaie de libérer l'ancienne valeur qui, à tort, n'a pas été conservée. C'est probablement le tableau que vous voyez dans la journalisation zombie.

En bref, changer

theFiles = [NSMutableArray arrayWithObjects:...]; 

à

self.theFiles = [NSMutableArray arrayWithObjects:...]; 

et assurez-vous de toujours utiliser self.foo (ou explicite [auto setFoo:] forme) lors de l'attribution à vos propriétés.

+0

Aha, qui a produit un message d'erreur plus utile (que j'ai ajouté au réponse), merci! – dbr

+0

Parfait, merci! – dbr

Questions connexes