NSMutabbleArray

quand je fais addObject c'est un pointeur qui est ajouté au tableau non? donc quand je fais dem release alors les pointeurs du tableau ne pointent vers rien et le removeAllobject plante !? est ce correct ?

Le addObject fait un retain qui incremente le compteur de référence.
Le removeAllObject fait un release sur tous les objets qui decremente le comteur de référence. Si le compteur arrive à 0, alors le dealloc est appelé.

Tu dis que en enlevant les release des property de Demande, ca fonctionne.
Le problème doit donc être la dessus car le dealloc est appelé (le compteur de référence arrive à 0)

Mais je ne vois pas le probleme

Mais tous les champs de Demande ne sont pas renseigné...
il faudrait peut être faire:
if (demIdCopro) {
[demIdCopro release];
}

mais je ne suis pas chez moi pour faire le test...
 
est ce que le fait de changer de vue , lorsque je clique sur une ligne de la tableView, fait un release sur le tableau?

non. La vue existe encore. Il y a juste des notifications (view will/did disappear)
 
si j'ajoute des objets demande sans attibuts :

Bloc de code:
Demande *dem =[[Demande alloc] init];
	/*
		dem.demTitle=[demandeD objectForKey:@"Title"];	
		dem.demId=[demandeD objectForKey:@"Id"];
		dem.demCreated=[demandeD objectForKey:@"Created"];
		dem.demDescriptif=[demandeD objectForKey:@"Description"];
		dem.demIdCopro=[demandeD objectForKey:@"Copropriete"];
		dem.demIdImmeuble=[demandeD objectForKey:@"Immeuble"];
		dem.demIdLot=[demandeD objectForKey:@"Lot"];
		dem.demStatut=[demandeD objectForKey:@"Statut"];;
		dem.demAuteur=[demandeD objectForKey:@"Author"];;
		dem.demIdAuteur=[demandeD objectForKey:@"IdAuthor"];;
		dem.demLoginAuteur=[demandeD objectForKey:@"Login"];;
		*/
			
		[tab_Demandes addObject:dem];		
		[dem release];

alors là je n'ai plus de crash ou de fuites mémoire. Je peux faire un removeAllObjects du tableau

j'ai un problème de retain/release/dealloc sur les properties de mes objets dem ajoutés au tableau

---------- Nouveau message ajouté à 18h03 ---------- Le message précédent a été envoyé à 16h40 ----------

Si je fais "ma boucle add:Object puis removeAllObjects" plusieurs fois pour le premier chargement ça ne plante pas.

C'est une fois que je clicke sur une ligne puis revient sur la table avec le bouton "back" que le problème survient.

Bloc de code:
//décrit ce qui se passe lorsqu'une cellule de la table est touched 
- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
    // Navigation logic may go here. Create and push another view controller.
	// AnotherViewController *anotherViewController = [[AnotherViewController alloc] initWithNibName:@"AnotherView" bundle:nil];
	// [self.navigationController pushViewController:anotherViewController];
	// [anotherViewController release];		
	
	//assignation de la variable demSelected
	demSelected=[tab_Demandes objectAtIndex:indexPath.row];	
	
	//le navigation controller pousse la view detailviewcontroller
	DetailViewController *newView =[[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:nil];
	[self.navigationController pushViewController: newView animated:YES ];
	
	[newView release];		
		}

demselected est une variable globale dans le appDelegate

Ma méthode de construction des cells:
Bloc de code:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath { 	
	
	static NSString *CellIdentifier = @"Cell";    
    CustomCellViewController *cell = (CustomCellViewController *)[tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    if (cell == nil) 
	{
       // NSLog(@"Cell created");
		NSArray *topLevelObjects = [[NSBundle mainBundle] loadNibNamed:@"CustomCellViewController" owner:nil options:nil];
		
		for(id currentObject in topLevelObjects)
		{
			if([currentObject isKindOfClass:[CustomCellViewController class]])
			{
				cell = (CustomCellViewController *)currentObject;
				break;
			}
		}
	}
		
		// Set up the cell...	
			
		cell.lbl_demId.text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row ] demId]];	
		cell.lbl_demCopro .text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row] demIdCopro ]];
		cell.lbl_demImmeuble.text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row] demIdImmeuble]];
		cell.lbl_demLot.text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row] demIdLot]];
		cell.lbl_demDescriptif.text=[NSString stringWithFormat:@"%@", [[tab_Demandes objectAtIndex:indexPath.row] demTitle]];
		if ([[[tab_Demandes objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Validée"])
		{
		cell.lbl_ImageView.image=[UIImage imageNamed:@"VDEM2.png"];
		}
		if([[[tab_Demandes objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Initiée"])
		{
		   cell.lbl_ImageView.image=[UIImage imageNamed:@"IDEM.png"];
		}
		if([[[tab_Demandes objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Terminée"])
		{
		cell.lbl_ImageView.image=[UIImage imageNamed:@"TDEM.png"];
		}
		if([[[tab_Demandes objectAtIndex:indexPath.row] demStatut] isEqualToString: @"En coursée"])
		{
		cell.lbl_ImageView.image=[UIImage imageNamed:@"EDEM.png"];
	 
		}
	
	return cell;
	   
}
 
Tu fais quoi ensuite avec ton demSelected mis a jour dans le didSelect ?
 
shift-command-y je crois que tu dois avoir un stack t'indiquant sur quel symbol le bad-exec apparait et dans quel thread, bien sur parfois le stack est corrompu quand tu as une appli engageant plus de 15 threads avec des try catch partout dans le code, mais dans ton cas...

quand tu auras finalement appris a te servir de GDB integré a xcode, tu mettras un breakpoint au bon endroit et le probleme se reglera de lui meme, c'est comme le port-salut c'est ecrit dessus. et si tu penses qu'il y des exceptions throwed qui pourraient cacher le probleme active "breakpoint on throw ou catch".

+ "static NSString *CellIdentifier = @"Cell";" arrete de copier betement les exemples que tu trouves, le cellIdentifier doit etre Unique, j'ai deja mainte et mainte fois posé un commentaire a propos de cette crétinerie, si tu veux reordered delete...

de plus il te manque une classe ton data source qui controlle les valeurs donnees a la tableview (un object contenant un array pour les valeurs (un objet contenant une image des proprietes a passer a la cell view) et un array pour la description bien sur bindé

le premier qui me dit "mais y a pas les bindings sur l'iphone je le tappe..."

et de cette classe, bien sur il est facile de transmettre une representation a des objects "managés" ou meme une simple base sqlite ou des objets distants (sur un serveur)

la tu melanges la vue, le model, le controller plus dans ton cas le DataModel controller qui est absent

mais j'en concois la difficulté la tableview est peut etre l'objet le plus mal fait de cocoa et uikit on peut sentir le repatch of repatch d'un design bancale des le depard, c'est pourquoi bon nombre de gens ont cree un tableview wrapper pouvant manipuler les sections aussi et en cocoa le multicolumn le tout accroché a un vraie datasource controller marquant par exemple des values deleted sans pour autant les virées du model original car tu auras peut etre besoin de faire des sync avec des objets (timestamp cree avec la meme base de reference est une bonne solution) distant que cela soit du network ou provenant d'une autre application

le wrapper ton je te parle represente 6 classes indestructicbles sans faiblesse qui t'assure un minimum de code au lieu du a la va comme je te pousse implementant les tableview delegates sur place creant un code illisible et incomprehensible heavy et finalement bugé et sale.

un conseil quand tu developpes pense "objet" et non pas le nez coincé dans l'application et ce qu'elle doit faire et finir avec une horreur lourde a changer et a faire evoluer avec un code non reutilisable, la mode des faux genies Indiens de l'informatique est un peu passée... les gens ont ete brulés des entreprises en sont mortes..., la tu fais du Bangalore style... du Bollywood plein de couleur ca chante ecetera mais au final c'est pourave et ca a couté excessivement chers

 
un conseil quand tu developpes pense "objet" et non pas le nez coincé dans l'application et ce qu'elle doit faire et finir avec une horreur lourde a changer et a faire evoluer avec un code non reutilisable, la mode des faux genies Indiens de l'informatique est un peu passée... les gens ont ete brulés des entreprises en sont mortes..., la tu fais du Bangalore style... du Bollywood plein de couleur ca chante ecetera mais au final c'est pourave et ca a couté excessivement cher
Niark :D
C'est la valeur ajoutee des interventions de Tatouille,en plus du conseil dev pertinent. Ca detend. Je lirais ce forum rien que pour ca.
 
bonjour à tous,

bon il s'en est passé des trucs ce week end sur le thread ... je suis rhabillé pour l'hiver là ... :D

Effectivement mon code n'est pas bien organisé, même si ça n'excuse pas tout c'est ma 1ère app et je connais pas obj-C ni le C. Je veux dans un premier temps faire quelque chose de fonctionnel, histoire de prendre en main le dev Iphone,les Views et contrôles.

Je suis là pour apprendre donc tous les conseils sont bons à prendre. Et c'est vrai je suis passé par des tutos sur le net, quand on connait rien bein c'est magnifique dans un premier temps ...

J'utilise les breakpoints et les "try/catch" mais je n'arrive pas à debugger ce problème. Je connais pas bien les outils et l'environnemnt de dev.

NyxOuf et Booboo : j'utilise demSelected pour l'affichage dans deux autres vues.

Je vais tester vos conseils. je reposterai si j'ose ... :affraid: ... ;)

bonne journée et merci
 
Encore une fois désolé pour mon code pas organisé, mais je debute sur xcode seul donc bon ...

Dans les autres vues j'utilise demSelected comme ça,pour l'affichage :

Bloc de code:
	lbl_copro.text=demSelected.demIdCopro;
	lbl_immeuble.text=demSelected.demIdImmeuble;
	lbl_lot.text=demSelected.demIdLot;
	lbl_statut.text=demSelected.demStatut;
	txtview_descriptif.text=demSelected.demDescriptif;
	lbl_nom.text=demSelected.demAuteur;
	lbl_date.text=demSelected.demCreated;
	lbl_titre.text=demSelected.demTitle;

ntx je regarde dans l'outil allocations.

NyxOuf plusieurs fois tu m'as parlé du debugger, je regardais et encore maintenant mais c'est vraiment pas évident au premier abord.


EDIT:
Voici ce qu'il ya dans le debugger:

-[MyTableViewController requestReloadDone:]
CFArrayRemoveAllValues
_CFArrayRemoveAllValues
CFRelease
-[Demande dealloc]
obj_msgSend

C'est bien le dealloc des demandes qui plante, d'ailleurs quand je commente ces release dans le dealloc il n'y a plus de plantages mais des fuites (normal).

Je ne release les objets dem qu'après les avoir ajoutés au tableau, je ne fais pas d'autres release ailleurs. Si je vais sur une autre vue (pas en cliquant sur la tableView le problème persiste, cela ne vient pas de demSelected que j'utilise dans le didSelectRow.
 
bon et bien problème réglé :)

le problème était qu'il y avait un temps de réponse que je ne voyais pas en mode debug, entre le moment où je fais ma requête et le moment où je recois le JSON. Forcément au "step by step" j'avais tout le temps du monde ... et le comportement n'était pas le même quen release. d'où le debug hasardeux.

je vais m'attaquer à la réorganisation du code.

Merci à tous pour votre aide constructive, je poursuis mon chemin ... bonne continuation a vous

++