NSNumber et ses amis

muqaddarmuqaddar Administrateur
09:53 modifié dans API AppKit #1
Salut,

J'essaie de récupérer un numéro ds une fonction :

Appel :
NSNumber* newId = [self getNewId];


Méthode :
- (id)getNewId <br />{<br />	NSEnumerator *enumerator = [Array objectEnumerator];<br />	NSDictionary* dict;<br />	int tempId = 0;<br />	int bigId = 0;<br />	<br />	while (dict = [enumerator nextObject]) {<br />		NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];<br />		if ([dict objectForKey:@&quot;Id&quot;]) tempId = [[dict objectForKey:@&quot;Id&quot;] intValue];<br />		if (tempId &gt; bigId) bigId = tempId;<br />	}<br />	return [NSNumber numberWithInt: bigId+1];<br />}


ça plante en sigenv 11... pas glops
Je me mélange les pinceaux entre NSNumber et int ?

Réponses

  • cbrandtcbrandt Membre
    09:53 modifié #2
    et le tempDict que tu alloues à  chaque tour dans ta boucle, il sert à  quoi ? ??? à  priori il est inutile...
    (à  moins que tu aies volotairement retiré quelques lignes de ta méthode avant de la poster)
  • ChachaChacha Membre
    09:53 modifié #3
    ça plante où ? dans le code qui est donné ou ailleurs dans le programme ?

    Quand tu fais
      NSNumber* newId = [self getNewId];
    et pas
      NSNumber* newId = [[self getNewId] retain];

    c'est voulu ? (newId est une variable temporaire, pour le coup)

    A quoi sert "tempDict" ?
  • ClicCoolClicCool Membre
    novembre 2004 modifié #4
    De ce que je comprend de ton code, tu te gourres pas entre NSNumber et int ;)

    mais ta méthode renvoie un NSNumber autoreleasé ne serait-ce pas là  ton pb ?
    Essaies de remplacer le constructeur de commodité:
    [NSNumber numberWithInt: bigID]
    par:
    [[NSNumber alloc] initWithInt: bigID]

    N'oublies pas, après, de releaser le NSNumber quand il n'est plus nécessaire.

    PS: il me semble + rapide de stocker la valeur d'un compteur auto-incrémenté que d'effectuer cette recherche chaque fois ...

    [EDIT] Grilled, Chacha a raison, tu peux aussi simplement ajouter un retain ...
    Pour ce qui est du tempDict je pense que c'est un relicat d'une précédente version ?
  • muqaddarmuqaddar Administrateur
    09:53 modifié #5
    Et bien, j'ai essayé les 2 :
    le retain et le alloc....

    Je suis juste passé d'une sigenv 11 à  une erreur 10 de bus...
    Bref, ça doit tjs être un pb de mémoire.

    tempDict est là  pour lire le dico de l'array, chacha.

    Normalement, je devrais avoir juste besoin du alloc comme le dit ClicCool pour que mon NSNumber soit tjs accessible.

    newId est une variable temporaire effectivement.
  • muqaddarmuqaddar Administrateur
    09:53 modifié #6
    J'ai trouvé.

    Apparemment, le pb vient de mon test :
    if ([dict objectForKey:@Id])
    Avec ce test, je voulais savoir si l'objet de la clé Id était vide ou pas , et si je le supprime, tout baigne.

    Mais il le faut ce test ...
    J'ai essayé ça : if ([NSNumber numberWithInt: [dict objectForKey:@Id]]) sans succès, sachant que c'est sauvegardé en plist sous forme d'entier <integer>...
  • ClicCoolClicCool Membre
    novembre 2004 modifié #7
    En théorie objetForKey: doit te retourner nil s'il n'y a pas de valeur pour la clef et ton test devrait marcher.

    A moins que tu n'ais un [NSNull NULL] dans ton dictionaire dans ces cas là  ... ?
    A ce moment là  objectForKey te renvoie l'adresse du NSNull et pas nil, et alors [[dict objectForKey:@Id] intValue] plante bien sur... ?

    As tu mis des NSNulls ou autre chose que des NSNumber pour la clef @ID dans ton dico  ? ?

    Essaies un test du genre:
    if ([[dict objectForKey:@&quot;Id&quot;] isKindOfClass:[NSNumber class]] ) {
    


    [EDIT] ce qui m'échape c'est que tu dis que sans le test tout baigne ? ???
  • muqaddarmuqaddar Administrateur
    09:53 modifié #8
    Yop,

    En fait, là  ça marche :

    - (id)getNewId <br />{<br />	int tempId = 0;<br />	int bigId = 0;<br />	NSEnumerator *enumerator = [vinsArray objectEnumerator];<br />	NSDictionary* dict;<br />	<br />	//si le tableau array a au moins une ligne<br />	while (dict = [enumerator nextObject]) {<br />		NSMutableDictionary *tempDict = [NSMutableDictionary dictionary];<br />		tempId = [[dict objectForKey:@&quot;vinId&quot;] intValue];<br />		if (tempId &gt; bigId) bigId = tempId;<br />	}<br />	return [NSNumber numberWithInt: bigId+1];<br />}
    


    Pas besoin de faire le test. Puisque si le tableau contient au moins un record, ça rentre ds la boucle.
    Merci encore.
    Et finalement, pas besoin de retain, ni alloc.
Connectez-vous ou Inscrivez-vous pour répondre.