NSArray : données qui se dupliquent ou qui disparaissent
Veillard
Membre
Bonjour,
J'ai un petit problème à vous soumettre :
Dans mon appli, je crée une liste de plongée sous forme d'Array de Dict
Chaque item du Dict correspond à une plongée où on trouve différents les paramètres de la plongée.
Ma liste de plongées est affichée sous forme d'une TableView.
J'ai récemment inclus dans les Dict d'autres paramètres correspondant à mes profils de plongées qui sont en fait des Array.
Bon, je vais résumer :
<array> // root
<dict> // une plongée
<string> // lieu
<string> // site
.... // etc...
<array> // profil (profondeur)
<array> // profil (alarme palier)
<array> // profil (alarme vitesse)
</dict>
</array>
Voilà , à chaque fois que j'ajoute ou que j'insère une plongée dans ma liste, les 3 Arrays de la plongée créée contiennent les données de la plongée précédente.
J'ai essayé de vider les Arrays à chaque fois que je créée une plongée avec :
:why?:
le problème, c'est que les données de la plongée précédente sont eux aussi effacées. Ce que je ne comprend pas, c'est que ça ne touche pas les autres objets du type String, Number...
D'où cela peut-il venir ?
J'ai un petit problème à vous soumettre :
Dans mon appli, je crée une liste de plongée sous forme d'Array de Dict
Chaque item du Dict correspond à une plongée où on trouve différents les paramètres de la plongée.
Ma liste de plongées est affichée sous forme d'une TableView.
J'ai récemment inclus dans les Dict d'autres paramètres correspondant à mes profils de plongées qui sont en fait des Array.
Bon, je vais résumer :
<array> // root
<dict> // une plongée
<string> // lieu
<string> // site
.... // etc...
<array> // profil (profondeur)
<array> // profil (alarme palier)
<array> // profil (alarme vitesse)
</dict>
</array>
Voilà , à chaque fois que j'ajoute ou que j'insère une plongée dans ma liste, les 3 Arrays de la plongée créée contiennent les données de la plongée précédente.
J'ai essayé de vider les Arrays à chaque fois que je créée une plongée avec :
<br /> [profilProfondeur removeAllObjects];<br /> [ASC_Flag removeAllObjects];<br /> [SLOW_Flag removeAllObjects];<br /> [profilProfondeur addObject: [NSNumber numberWithDouble:0.0]];<br /> [ASC_Flag addObject: [NSNumber numberWithInt:0]];<br /> [SLOW_Flag addObject: [NSNumber numberWithInt:0]];<br />
:why?:
le problème, c'est que les données de la plongée précédente sont eux aussi effacées. Ce que je ne comprend pas, c'est que ça ne touche pas les autres objets du type String, Number...
D'où cela peut-il venir ?
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Logique, tu manipules le même pointeur. Le problème est en amont, quand tu initialises la nouvelle plongée, tu dois utiliser les tableaux du profil en cours ou un truc du genre. Vérifie que tu initialises bien correctement ces tableaux de profils
J'ai rajouté
dans : - (id)init et rien n'a changé
J'initialise mes données à chaque nouvelle plongée avec ceci :
Quand je clique sur une nouvelle plongée j'appelle l'initialisation comme ceci :
Est-ce la bonne technique ?
Lorsque tu fais:
[profilProfondeur removeAllObjects];
tu utilises toujours le même objet (pointeur). Quand tu sauvegardes une plongée, tu crées une copie de ces objets ? sinon il y a de fortes chances pour que toutes les plongées partagent le même objet !
init du contrôleur ? appellé une seule fois à la création du document ?
C'est tout à fait ce qui se passe
Justement, quand je sauvegarde, je peux modifier la dernière plongée dans que la précédente soit modifiée, ceci à condition de fermer et de réouvrir mon document.
Oui
Donc pour chaque nouvelle plongée c'est le même objet profilPronfondeur, dans blankFields essaye:
[profilProfondeur release]; // libère l'ancien profil ( au démarrage créé dans init du contrôleur ? )
profilProfondeur = [[NSMutableArray alloc] init];
Pour info, les trois tableaux ont des accesseurs, ça peut peut-être venir de là ?
- création de profilPronfondeur dans init du contrôleur -> count =1
- sauvegarde du profil setObject: profil forKey: ... ->count =2
- création nouveau profil [ profilProfondeur release] -> count=1 ou 0 si pas de sauvegarde
conclusion: ça peut pas planter
enfin si tu fais comme ça ;D
J'ai essayé de débugger, ça me met ceci :
J'y comprends rien ???
Par contre, j'ai :
et dans le crash log ça dit quoi ?
J'ai un accesseur :
Ca peut peut-être interférer, sinon, je ne vois pas ???
Quel est le code que tu mets dans cet accesseur? Si tu fais par exemple (myData étant la variable d'instance):
ça peut planter dans le cas où myData == data (autrement dit si c'est le même objet, à ne pas confondre avec [data isEqualToData:myData], qui peut renvoyer TRUE si on a affaire à deux objets différents, mais contenant des variables semblables). Si c'est comme ça, deux solutions: [myData autorelease] au lieu du release, ou passer par une variable temporaire:
C'était effectivement le cas (erreur de débutant )
Par contre, j'ai toujours mon objet partagé. Maintenant, j'ai pourtant :
Quand je fais :
la plongée ajoutée a les 3 tableaux vierges, quand je clique sur la plongée précédents => plantage et 2 plongées avant => ok
Si je fais :
la plongée ajoutée contient des tebleaux vierges et efface toujours celle d'avant
pourquoi utiliser NSData ?
pourquoi ne pas communiquer le tableau à profilView:
Mais il me semble que tu as déjà eu un problème similaire avec les plongées, tu gère les données de plongées différemment des données de profils ?
Tu sembles utiliser les objets de la fiche prédédemment affichée et comme ils ont étés libérés ...
Je pense que tu ne sauvegarde pas les bons objets dans le plist, ou alors les pointeurs ont été modifiés entre temps (profilView ?)
Et regarde auusi dans le fichier:
~/Library/logs/CrashReporter/Plongée.crash.log
C'était un exemple. J'utilise NSMutableArray à la place.
C'est en effet ce qu'on avait fait. Le seul problème, c'est quand je fais un "release", ça plante
C'est pour ça, que j'ai utilisé la méthode de Renaud pour résoudre ce problème de "release"
Mais le problème de "partage" persiste... :-\\
Je pense que ça cache le vrai problème, la vérité est ailleurs :-*
Tu supprimes tous les release/init dans blankFields, mais lorsque tu sauvegarde s dans le plist tu crées une copie:
NSMutableArray* copie=[profilProfondeur clone]; // ou autre méthode, j'suis pas sûr
[dic setObject: copie forKey: clef];
[copie release]; // ?
mon code est peut-être pas bon, c'est juste une idée :P
Ca doit être :
Que se passe-t-il si la personne créée des plongées à la volée sans enregistrer à chaque fois ???
Je vais essayer ce soir à la maison :P
ça ne résoudra pas ton problème, mais il y a une grosse fuite mémoire là ... Il ne faut pas oublier de terminer les dealloc par [super dealloc]; sinon l'objet n'est pas viré de la mémoire...
J'avais oublié...
Merci Renaud