Plantage avec NSLog

muqaddarmuqaddar Administrateur
janvier 2005 modifié dans API AppKit #1
Salut,

Lorsque je demande l'affichage d'un dico envoyé ds une fonction, je prends un signal 11 (sigenv).

- (void)filtreWithDicoFiltre:(NSDictionary*)dicoPourFiltrage<br />{<br />	NSLog(@&quot;dicoPourFiltrage : %@&quot;, dicoPourFiltrage);


et la fonction qui l'envoie :
[self filtreWithDicoFiltre:dicoFiltre];


Où est le problème de mémoire ?
Si je demande son affichage ds la méthode ou il est créé , pas de pb...
Il est déclaré ainsi dans le init :
dicoFiltre = [[NSMutableDictionary alloc] init];

Réponses

  • BruBru Membre
    23:47 modifié #2
    Si ce n'est pas ton NSMutableDictionary qui plante, alors ça peut être un des objets qu'il contient...

    .
  • muqaddarmuqaddar Administrateur
    23:47 modifié #3
    Il contient ça :

    switch ([tableView tag]) {<br />			case 1 : [dicoFiltre setObject:selectedId forKey:@&quot;couleurId&quot;];<br />			break;&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />			case 3 : [dicoFiltre setObject:selectedId forKey:@&quot;paysId&quot;];<br />			break;<br />		}<br />
    


    selectedID étant déclaré ainsi :
    NSString* selectedId;

    que j'ai remplacé par :
    NSString* selectedId = [NSString string];
    pour l'autorelease.

    ça semble marcher maintenant.
    Mon raisonnement est-il bon ?
  • Eddy58Eddy58 Membre
    23:47 modifié #4
    Oui effectivement il ne faut jamais utiliser des objets non alloués, sinon plantage assuré...;)
  • BruBru Membre
    23:47 modifié #5
    Effectivement, ça me parait propre...

    La méthode string de NSString renvoie une chaà®ne en autorelease. Mais comme le setObject de NSDictionary fait un retain implicite, il n'y a pas de fuite de mémoire.

    Pour ce plantage, je ne vois pas trop alors...

    .
  • muqaddarmuqaddar Administrateur
    23:47 modifié #6
    Donc normalement, j'aurais pas du en avoir besoin (de l'autorelease) grâce au retain automatique de setObject ?
  • BruBru Membre
    23:47 modifié #7
    Voici ce qui se passe (dans une gestion idéale de la mémoire) :
    • 1: string de NSString renvoie un objet avec un compteur de référence à  1.
    • 2: string de NSString dépose cet objet dans l'autorelease pool.
    • 3: setObject de NSDictionary fait un retain sur l'objet, donc le compteur passe à  2.

    (un peu plus tard...)
    • 4: l'autorelease pool est détruit, ce qui provoque un release sur les objets qu'il contient : le compteur repasse à  1.

    (encore un peu plus tard...)
    • 5: le NSDictionary est détruit, ou l'objet est enlevé (par removeObjectForKey par exemple) : le compteur passe à  0. L'objet est donc détruit !


    .
  • muqaddarmuqaddar Administrateur
    23:47 modifié #8
    Merci pour ces précisions bru. ;)
Connectez-vous ou Inscrivez-vous pour répondre.