Nsdictionnary fait quitter mon appli par une erreur 10

GenoseGenose Membre
15:29 modifié dans API AppKit #1
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 ?

Réponses

  • octobre 2005 modifié #2
    J'en pense que tu n'as pas encore saisi la gestion de l'autorelease pool.

    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...
  • AliGatorAliGator Membre, Modérateur
    15:29 modifié #3
    Ben non c'est logique que ça plante.

    [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]
  • 15:29 modifié #4
    Pas mal de le grilled après 35 minutes... on sait que tu pouvais répondre maintenant !
  • AliGatorAliGator Membre, Modérateur
    15:29 modifié #5
    Ouais en fait j'ai ouvert dans les onglets Safari tous les nouveaux messages d'Objective-Cocoa et de macfr.com en même temps :o , et le temps que je lise les posts et que j'arrive à  celui-là  tu avais déjà  répondu...
    Mais comme j'ai pas fait de reload de la page avant de répondre... :)
  • odjauodjau Membre
    15:29 modifié #6
    A la fois, c'est pas très grave que l'un est "grilled" l'autre. Les conclusions sont identique, mais les explications différemment exprimées... tous le monde y gagne :)
  • GenoseGenose Membre
    15:29 modifié #7
    merci d'avoir répondu si vite, et  même si s'est de façon bien authentique.

Connectez-vous ou Inscrivez-vous pour répondre.