Nsdictionnary fait quitter mon appli par une erreur 10
Genose
Membre
salut,
j'ai une drôle de trouvaille, dans mon appli avec un NSDictionnary, voyez donc :
NSMutabledictionnary *Dict = [NSMutableDictionary dictionnary ] ;
NSMutabledictionnary *Dict = [[NSMutableDictionary alloc]init ] ;
elles me semble donner le meme resultat, un dictionnaire vide, et pourtant la premiere (+dictionary), plante mon appli quand je quitte par une erreur 10(bus) ou 11 !
au contraire de alloc, init , où là , mon appli quitte normalement avec un status neutre (0)
j'utilise ce dictionnaire, fait un appel de methode, puis je l'efface 3 lignes plus bas.
c'est assez embêtant quand on y passe toute sa journée à débugger pour rien et que c'est tout con mais pas évident à trouver.
que en pensez-vous ?
j'ai une drôle de trouvaille, dans mon appli avec un NSDictionnary, voyez donc :
NSMutabledictionnary *Dict = [NSMutableDictionary dictionnary ] ;
NSMutabledictionnary *Dict = [[NSMutableDictionary alloc]init ] ;
elles me semble donner le meme resultat, un dictionnaire vide, et pourtant la premiere (+dictionary), plante mon appli quand je quitte par une erreur 10(bus) ou 11 !
au contraire de alloc, init , où là , mon appli quitte normalement avec un status neutre (0)
j'utilise ce dictionnaire, fait un appel de methode, puis je l'efface 3 lignes plus bas.
c'est assez embêtant quand on y passe toute sa journée à débugger pour rien et que c'est tout con mais pas évident à trouver.
que en pensez-vous ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Pour moi les deux sont très différents, le premier sera ajouté dans l'autorelease pool et donc détruit automatiquement et donc tu n'as pas à le faire en fin de méthode. Son "retain count" reste à 1 jusqu'à la fin de ma méthode mais reviendra à 0 "après" la méthode justement...
Le second n'est pas ajouté à l'autorelease pool, c'est toi qui gère sa durée de vie, tu dois alors faire un release pour libérer la mémoire.
Les sigbus 10 ou 11 sont généralement rencontrés sur ce genre de problème.
La trouvaille des bugs objective-c ce n'est pour aujourd'hui...
[NSMutableDictionary dictionary] est équivalent ) [[[NSMutableDictionary alloc] init] autorelease] et non pas à simplement [[NSMutableDictionary alloc] init]
Donc avec le [NSMutableDictionary dictionary] tu crées un objet autoreleasé, dont que tu n'auras pas à releaser par toi même puisqu'il sera dans l'autoreleasepoll et donc automatiquement releasé après la fin de la méthode (la fin du code).
Forcément si un peu plus loin de ton NSMutableDictionary* md =[NSMutableDictionary dictionary] tu fais un [md release], son retaincount va passer à zéro et il sera releasé et déalloué,alors que tu n'avais pas à le faire puisqu'il a été mis dans l'autoreleasepool.
Conclusion, quand l'autoreleasepool voudra faire son boulot, donc envoyer un release à md après la fin du code, ben il va essayer d'envoyer un release à un truc qui n'existe plus, un espace mémoire déja désalloué... donc kaboum patatras. >:D
[EDIT : grilled]
Mais comme j'ai pas fait de reload de la page avant de répondre...