NSNumber et ses amis
muqaddar
Administrateur
Salut,
J'essaie de récupérer un numéro ds une fonction :
Appel :
Méthode :
ça plante en sigenv 11... pas glops
Je me mélange les pinceaux entre NSNumber et int ?
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:@"Id"]) tempId = [[dict objectForKey:@"Id"] intValue];<br /> if (tempId > 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 ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
(à moins que tu aies volotairement retiré quelques lignes de ta méthode avant de la poster)
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" ?
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 ?
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.
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>...
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:
[EDIT] ce qui m'échape c'est que tu dis que sans le test tout baigne ? ???
En fait, là ça marche :
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.