NSMutabbleArray

esbeone

Membre confirmé
22 Septembre 2010
16
0
41
Bonjour à tous,

J'ai des fuites mémoire dans mon application.

J'ai une classe Demande avec des propriétés définies par property/synthesize.

J'ajoute des objets de type Demande dans un tableau. Ce tableau est déclaré dans le appDelegate avec property/synthesize. Il est remplit une première fois lorsque l'app a finit de se lancer (appDidFinishLaunching):

...
Demande *dem =[[Demande alloc] init];
dem.demTitle=titre;
dem.demId=Id;
[tab_Demandes addObject:dem];
[dem release];
...

Je souhaite plus tard re-remplir ce tableau.

Cela se fait dans la classe MyTableViewController:

[[appDelegate tab_Demandes] removeAllObjects];
...
Demande *dem =[[Demande alloc] init];
dem.demTitle=titre;
dem.demId=Id;
dem.demCreated=created;
[[appDelegate tab_Demandes] addObject:dem];
[dem release];
...

Je veux faire un [[appDelegate tab_Demandes] removeAllObjects] depuisTableViewController avant de re remplir mon tableau pour effacer les demandes ajoutées dans appDelegate. Mais mon appli plante sur le remove: bad_access.

Si je ne fais pas de remove, je n'ai pas de fuites mémoire mais mes demandes sont alors en double.

Si je ne fais pas de [dem release] dans appDelegate alors je peux faire un remove dans TableViewController et mon tableau est ok. Mais alors j'ai une fuite mémoire: autant que le nombre de dem non releasées.

Si je release dem : pas de fuites, pas de remove donc demandes en double
Si je ne release pas dem : remove fonctionne, tableau ok mais fuites.

Je peux faire un [[appDelegate tab_Demandes] removeAllObjects] depuis appDelegate mais pas depuis une autre classe.

J'espère avoir été clair, je ne comprends pas trop ce qui se passe en fait.

C'est ma première app.

Merci pour toute aide.
 
C'est difficile de répondre sans voir plus de code, mais ce que tu fais est bon: les classes de collection (NSArray, NSDictionary, NSSet et leur versions Mutables) retiennent les objets qu'elle contiennent. Après avoir ajouté un objet que tu viens d'allouer, il faut donc bien le libérer comme tu le fais.

Tu peux essayer d'activer le NSZombie pour mieux comprendre ce qui se passe.

Essaye aussi de lancer une analyse statique du code (sous XCode: menu Build > Build & Analyze).

P.S.: Je te recommande de ne pas utiliser les propriétés tant que tu ne comprends pas exactement quel code elles génèrent.
 
Bonjour Céroce,

on est presque voisin , j'habite à Gouvieux.

Le build and analyse n'a pas trouvé de leaks.

En ce qui concerne les propriétés, j'ai essayé en déclarant le tableau externe mais les fuites persistent et je ne peux pas faire de removeAllObjects sur mon tableau.

C'est ma première appli, c'est un peu difficile cette gestion mémoire. Je suis .Net c# à la base.

Peut être je peux t'envoyer mon projet en MP?
 
Je vais vous expliquer plus en détails mon problème avec mon code:

Demande.h:

Bloc de code:
@interface Demande : NSObject {
	
	//attibuts de la classe demande
	NSString *demId;
	NSString *demStatut;
	NSString *demTitle;
	NSString *demCreated;
	NSString *demIdCopro;
	NSString *demIdImmeuble;
	NSString *demIdLot;
	NSString *demDescriptif;
	NSString *demAuteur;
	NSString *demIdAuteur;
	NSString *demLoginAuteur;	
}
@property (retain,nonatomic) NSString *demId;
@property (retain,nonatomic) NSString *demIdCopro;
@property (retain,nonatomic) NSString *demIdImmeuble;
@property (retain,nonatomic) NSString *demIdLot;
@property (retain,nonatomic) NSString *demDescriptif;
@property (retain,nonatomic) NSString *demStatut;
@property (retain,nonatomic) NSString *demTitle;
@property (retain,nonatomic) NSString *demCreated;
@property (retain,nonatomic) NSString *demAuteur;
@property (retain,nonatomic) NSString *demIdAuteur;
@property (retain,nonatomic) NSString *demLoginAuteur;
@end

Demande.m:
Bloc de code:
@implementation Demande

@synthesize demId,demIdCopro,demIdImmeuble,demIdLot,demDescriptif,demStatut,demTitle,demCreated,demAuteur,demIdAuteur,demLoginAuteur;


- (void)dealloc {	
	[demId release];
	[demIdCopro release];
	[demId release];
	[demIdImmeuble release];
	[demIdLot release];
	[demDescriptif release];
	[demStatut release];
	[demTitle release];
	[demCreated release];
	[demAuteur release];
	[demIdAuteur release];
	[demLoginAuteur release];
	
	
	[super dealloc];
}

@end


appDelegate:
Mon application une fois chargée fait une requête et recoit un json. je parse le json et ajoute les objets demande dans tab_Demandes.
Ensuite la tableView est chargée avec des custom cell.


Dans appDelegate.h:

Bloc de code:
NSMutableArray *tab_Demandes;
@property (nonatomic,retain) NSMutableArray *tab_Demandes;

Dans appDelegate.m:
Bloc de code:
@synthesize tab_Demandes
- (void)requestDDone:(ASIHTTPRequest *)request
{
	
	NSData *responseData = [request responseData];		
	//Stocke les données dans jsonstring
	NSString *jsonString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
	//NSLog(@"JSON: %@",jsonString);	
	
	//Crée un dictionnaire à partir du json string
	NSDictionary *results = [jsonString JSONValue];
	
	//stocke dans un tableau chaque objet du dictionnaire
	NSArray *demandes = [results objectForKey:@"Demandes"];		
	
	for (NSDictionary *demandeD in demandes)
	{
				
		//parse du JSON
		NSString *title = [demandeD objectForKey:@"Title"];
		NSString *titre = [title stringByReplacingPercentEscapesUsingEncoding:
						   NSASCIIStringEncoding];
		
		NSString *description = [demandeD objectForKey:@"Description"];
		NSString *descriptif = [description stringByReplacingPercentEscapesUsingEncoding:
									  NSASCIIStringEncoding];

		NSString *Id = [demandeD objectForKey:@"Id"];
		NSString *created = [demandeD objectForKey:@"Created"];
		NSString *statut = [demandeD objectForKey:@"Statut"];
		NSString *copropriete = [demandeD objectForKey:@"Copropriete"];
		NSString *immeuble = [demandeD objectForKey:@"Immeuble"];
		NSString *lot = [demandeD objectForKey:@"Lot"];
		NSString *auteur = [demandeD objectForKey:@"Author"];
		NSString *auteurId = [demandeD objectForKey:@"IdAuthor"];
		NSString *auteurLogin = [demandeD objectForKey:@"Login"];
		
		//Creation de l'objet
		Demande *dem =[[Demande alloc] init];		
		dem.demTitle=titre;
		dem.demId=Id;
		dem.demCreated=created;
		dem.demDescriptif=descriptif;
		dem.demIdCopro=copropriete;
		dem.demIdImmeuble=immeuble;
		dem.demIdLot=lot;
		dem.demStatut=statut;
		dem.demAuteur=auteur;
		dem.demIdAuteur=auteurId;
		dem.demLoginAuteur=auteurLogin;	
		
		[tab_Demandes addObject:dem];
				
		[dem release];
	
	}
	[jsonString release];	
}

Customcell dans MytableViewController.m:

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...

	
		TabsAppDelegate *appDelegate = (TabsAppDelegate*)[[UIApplication sharedApplication] delegate];
	
		cell.lbl_demId.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row ] demId]];
		
	
		cell.lbl_demCopro .text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demIdCopro ]];
		cell.lbl_demImmeuble.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demIdImmeuble]];
		cell.lbl_demLot.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demIdLot]];
		cell.lbl_demDescriptif.text=[NSString stringWithFormat:@"%@", [[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demTitle]];
		//NSLog(@"statut demande : %@",[[tab_Demandes objectAtIndex:indexPath.row] demStatut]);
		if ([[[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Validée"])
		{
		cell.lbl_ImageView.image=[UIImage imageNamed:@"VDEM2.png"];
		}
		if([[[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Initiée"])
		{
		   cell.lbl_ImageView.image=[UIImage imageNamed:@"IDEM.png"];
		}
		if([[[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demStatut] isEqualToString: @"Terminée"])
		{
		cell.lbl_ImageView.image=[UIImage imageNamed:@"TDEM.png"];
		}
		if([[[[appDelegate tab_Demandes] objectAtIndex:indexPath.row] demStatut] isEqualToString: @"En coursée"])
		{
		cell.lbl_ImageView.image=[UIImage imageNamed:@"EDEM.png"];
	 
		}

	
	return cell;
	   
}


Chaque fois que je clique sur une ligne de la table , j'accède aux infos de la demande dans une vue specifique.

Quand je fais"back" et revient à la tableView je refais une requete pour rafraichir la liste des demandes.

Dans MyTableViewController.m:
Bloc de code:
- (void)requestDReloadDone:(ASIHTTPRequest *)request
{

	TabsAppDelegate *appDelegate = (TabsAppDelegate*)[[UIApplication sharedApplication] delegate];
	
	NSData *responseData = [request responseData];	
	
	//Stocke les données dans jsonstring
	NSString *jsonString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
	//NSLog(@"JSON: %@",jsonString);
	//Crée un dictionnaire à partir du json string
	NSDictionary *results = [jsonString JSONValue];
	//stocke dans un tableau chaque objet du dictionnaire
	NSArray *demandes = [results objectForKey:@"Demandes"];			

	//[[appDelegate tab_Demandes] removeAllObjects]; //PLANTAGE	
	
	for (NSDictionary *demandeD in demandes)
	{		
		//parse du JSON
		NSString *titre = [demandeD objectForKey:@"Title"];
		NSString *desriptif = [demandeD objectForKey:@"Description"];
		NSString *Id = [demandeD objectForKey:@"Id"];
		NSString *created = [demandeD objectForKey:@"Created"];
		NSString *statut = [demandeD objectForKey:@"Statut"];
		NSString *copropriete = [demandeD objectForKey:@"Copropriete"];
		NSString *immeuble = [demandeD objectForKey:@"Immeuble"];
		NSString *lot = [demandeD objectForKey:@"Lot"];
		NSString *auteur = [demandeD objectForKey:@"Author"];
		NSString *auteurId = [demandeD objectForKey:@"IdAuthor"];
		NSString *auteurLogin = [demandeD objectForKey:@"Login"];
		
		//Creation de l'objet
		Demande *dem =[[Demande alloc] init];		
		dem.demTitle=titre;
		dem.demId=Id;
		dem.demCreated=created;
		
		NSString *descriptifDecode = [desriptif stringByReplacingPercentEscapesUsingEncoding:
									  NSASCIIStringEncoding];		//gestion des accents
		
		dem.demDescriptif=descriptifDecode;
		dem.demIdCopro=copropriete;
		dem.demIdImmeuble=immeuble;
		dem.demIdLot=lot;
		dem.demStatut=statut;
		dem.demAuteur=auteur;
		dem.demIdAuteur=auteurId;
		dem.demLoginAuteur=auteurLogin;
	
		[[appDelegate tab_Demandes] addObject:dem];
		
		[dem release];
	}
	
	
	//on fait apparaitre la vue	
	[super viewWillAppear:YES];
	[tableV reloadData];
	
	[jsonString release];
}
Ce code est redondant, similaire à celui dans appDelegate. Si j'appelle la méthode qui est dans appDelegate le problème est le même. J'ai besoin de faire un reloadData sur TableV qui est ma tableView. Elle est déclarée dansMyTabvleViewController.h:
Bloc de code:
IBOutlet UITableView *tableV;

Si je ne release pas l'objet demande [dem release]; je peux par la suite faire [[appDelegate tab_Demandes] removeAllObjects]. mais les objets dem sont leaked.

Si je fais [dem release] alors je ne peux plus faire [appDelegate tab_Demandes] removeAllObjects]. Je n'ai plus de fuites mais j'ai les anciennes demandes dans tab_Demandes.


NyxOuf je pense que c'est un accès concurrent. Je viens de remarquer que je peux faire un [appDelegate tab_Demandes] removeAllObjects] dans appDelegate mais pas depuis MytableViewController.m .

"Passe ton array en ivar dans ton viewcontroller"? tu veux dire quoi par là?

Je suis newbie en objective-C.
 
Pourquoi tu gères ton array dans le AppDelegate et pas dans ton ViewController, alors que c'est ici que tu en as besoin ? Tu t'embêtes là... et ça fait du code vachement redondant.


Dans ton MytableViewController.h

Bloc de code:
NSMutableArray* tableau;

MytableViewController.h

Bloc de code:
-(void)viewDidLoad
{
   tableau = [[NSMUtableArray alloc] init];
}
-(void)dealloc
{
   [tableau release];
}

Et y a aucune raison d'appeller [super viewWillAppear:animated]; dans un callback.
 
je fais les modifs et je te tiens au courant

merci

---------- Nouveau message ajouté à 13h06 ---------- Le message précédent a été envoyé à 11h56 ----------

j'ai fais les modifs.

1) quand mon app se lance ma tableView reste vide. Par contre après être allé sur une autre vue, quand je reviens sur la tableView celle ci se peuple.

2)le même problème persiste. Je ne peux pas faire de removeAllObjects :

Bloc de code:
- (void)requestDReloadDone:(ASIHTTPRequest *)request
{

	NSData *responseData = [request responseData];	
	
	//Stocke les données dans jsonstring
	NSString *jsonString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];
	//NSLog(@"JSON: %@",jsonString);
	//Crée un dictionnaire à partir du json string
	NSDictionary *results = [jsonString JSONValue];
	//stocke dans un tableau chaque objet du dictionnaire
	NSArray *demandes = [results objectForKey:@"Demandes"];	

	[tab_Demandes removeAllObjects]; PLANTAGE
	
	for (NSDictionary *demandeD in demandes)
	{
	
		//parse du JSON
		NSString *titre = [demandeD objectForKey:@"Title"];
		NSString *desriptif = [demandeD objectForKey:@"Description"];
		NSString *Id = [demandeD objectForKey:@"Id"];
		NSString *created = [demandeD objectForKey:@"Created"];
		NSString *statut = [demandeD objectForKey:@"Statut"];
		NSString *copropriete = [demandeD objectForKey:@"Copropriete"];
		NSString *immeuble = [demandeD objectForKey:@"Immeuble"];
		NSString *lot = [demandeD objectForKey:@"Lot"];
		NSString *auteur = [demandeD objectForKey:@"Author"];
		NSString *auteurId = [demandeD objectForKey:@"IdAuthor"];
		NSString *auteurLogin = [demandeD objectForKey:@"Login"];
		
		//Creation de l'objet
		Demande *dem =[[Demande alloc] init];		
		dem.demTitle=titre;
		dem.demId=Id;
		dem.demCreated=created;
		
		NSString *descriptifDecode = [desriptif stringByReplacingPercentEscapesUsingEncoding:
									  NSASCIIStringEncoding];		//gestion des accents
		
		dem.demDescriptif=descriptifDecode;
		dem.demIdCopro=copropriete;
		dem.demIdImmeuble=immeuble;
		dem.demIdLot=lot;
		dem.demStatut=statut;
		dem.demAuteur=auteur;
		dem.demIdAuteur=auteurId;
		dem.demLoginAuteur=auteurLogin;
	
		[tab_Demandes addObject:dem];
		
		[dem release];
	}	
	//on fait apparaitre la vue	
	[super viewWillAppear:YES];
	NSLog(@"nb de demandes dans tab_demandes,fin boucle ajout: %d",[tab_Demandes count]);
	[tableV reloadData];	
	[jsonString release];
}

- (void)dealloc {
	[tab_Demandes release];
    [super dealloc];
}
 
1) Merci. Je faisais un relaodData mais au mauvais endroit avec les modifs de code précédentes. De même l'alloc et init du tableau tab_Demandes étaient fausses. Maintenant ça marche au lancement de l'appli.

2) l'application se comporte différemment. je peux maintenant faire removeAllObjects en ayant fait un [dem release] auparavant. il y a toujours des fuites. je reviens quand j'ai compris un peu plus ce qui se passe maintenant.

---------- Nouveau message ajouté à 15h00 ---------- Le message précédent a été envoyé à 14h49 ----------

Je n'ai pas beaucoup de temps cet après midi à consacrer à l'appli iPhone.

Je peux enfin faire un removeAllObjects et releaser les éléments que j'insère dans le tableau.

Il me reste une fuite. C'est une nouvelle. Elle concerne le tableau tab_Demandes ainsi que les objets contenus dans le tableau.

Je dois faire alloc et release au mauvais endroit. Je vais fouiller en fin de journée. Sinon demain matin je reviendrai.

Merci encore.
 
J'ai suivi ton pb de loin...
Le problème corrigé était lequel ?
le release était avant le alloc/init ?
 
problème corrigé:

j'instanciais des objets, j’insérais ces objets dans un tableau, je les "release" et après je ne pouvais plus faire de "removeallObjects" sur le tableau. Je faisais cela dans le appDelegate ainsi que dans tableViewController.

Le fait de déclarer le tableau dans la tableViewController et non dans le appDelegate m'a permis de faire "removeAllObjects", ce que m'a conseillé Nyx0uf. D'ailleurs les traitements sur le tableau peuvent se faire dans le tableViewcontroller uniquement. Je comprenais mal le lancement de l'appli.

Ensuite avec le changement de déclaration du tableau, ma tableview ne se peuplait pas.
J'ai déplacé le "tableView reloadData" et l'alloc/init du tab_Demandes.
Maintenant ça fonctionne. Toujours d'après Nyx0uf.


Nouveau problème :


Maintenant j'ai une nouvelle leak mémoire sur le tableau. Je n'ai pas eu encore le temps de regarder.
 
Je suis de retour ;-)

Bon en fait mon problème d'hier n'est pas réglé, ce que je croyais hier soir. J'ai été un peu vite, j'avais pas le temps de regarder vraiment en détail.

Voici mon code simplifié (c'est bcp plus simple maintenant, merci NyxOuf) :

tab_Demandes est déclaré dans MyTableViewController.h sans property :

NSMutableArray *tab_Demandes;

Bloc de code:
- (void)viewWillAppear:(BOOL)animated 
{	
    if(firstLaunch==TRUE) 
	{
		tab_Demandes=[[NSMutableArray alloc]init]; 
		[self demandesReload_grabURL];		
		firstLaunch=FALSE;
	}
	else {
		[tab_Demandes removeAllObjects];  //----- PLANTAGE
		[self demandesReload_grabURL];		
	}		
}

- (void)requestDReloadDone:(ASIHTTPRequest *)request
{	
	
	NSData *responseData = [request responseData];		
	//Stocke les données dans jsonstring
	NSString *jsonString = [[NSString alloc] initWithData:responseData encoding:NSUTF8StringEncoding];

	//Crée un dictionnaire à partir du json string
	NSDictionary *results = [jsonString JSONValue];
	//stocke dans un tableau chaque objet du dictionnaire
	NSArray *demandes = [results objectForKey:@"Demandes"];	
	
	for (NSDictionary *demandeD in demandes)
	{

		//parse du JSON
		NSString *titre = [demandeD objectForKey:@"Title"];
		NSString *desriptif = [demandeD objectForKey:@"Description"];
		NSString *Id = [demandeD objectForKey:@"Id"];
		NSString *created = [demandeD objectForKey:@"Created"];
		
		
		//Creation de l'objet
		Demande *dem =[[Demande alloc] init];		
		dem.demTitle=titre;
		dem.demId=Id;
		dem.demCreated=created;
		
		NSString *descriptifDecode = [desriptif stringByReplacingPercentEscapesUsingEncoding:
									  NSASCIIStringEncoding];		//gestion des accents
		
		dem.demDescriptif=descriptifDecode;
	
		[tab_Demandes addObject:dem];
		
		[dem release];
	}
	
	
	//on fait apparaitre la vue	
	[super viewWillAppear:YES];

	[tableV reloadData];
	
	[jsonString release];
}

- (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView {
    return 1;
}


- (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section {   
	return [tab_Demandes count];
}


- (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;
	   
}


- (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath {
	
	//assignation de la variable globale 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];	
}


- (void)dealloc {
    [tab_Demandes release];
    [super dealloc];
}

voilà mon code.

Le premier chargement de la tableView marche nickel.
C'est quand je reviens sur cette vue, après avoir clické sur une ligne par exemple et je fais "back" que le problème arrive.

Je dois vider et recharger mon tableau servant à peupler la tableView.

removeAllObjects plante dans viewWillAppear. Comme ci quelque chose release les objets avant ou alors quelque chose "pointe" sur les objets du tableau ...

si vous avez une petite idée je testerai volontiers.
 
1 - Pour ton BOOL, c'est YES ou NO.

2 - init ton tableau dans viewDidLoad plutôt que viewWillAppear: vu que cette dernière est appelée chaque fois que la vue se charge, ça t'évitera un if.

3 - Dans ta méthode requestDReloadDone: ne fais pas de [super viewWillAppear:], Ca n'a strictement rien à faire ici, ta vue est déjà apparue à ce moment là.
 
ok merci pour ces conseils.

Je crois avoir trouvé une piste :

Ma classe Demande:

Bloc de code:
@interface Demande : NSObject {	
	//attibuts de la classe demande
	NSString *demId;
	NSString *demStatut;
	NSString *demTitle;
	NSString *demCreated;
	NSString *demIdCopro;
	NSString *demIdImmeuble;
	NSString *demIdLot;
	NSString *demDescriptif;
	NSString *demAuteur;
	NSString *demIdAuteur;
	NSString *demLoginAuteur;	
}
@property (retain,nonatomic) NSString *demId;
@property (retain,nonatomic) NSString *demIdCopro;
@property (retain,nonatomic) NSString *demIdImmeuble;
@property (retain,nonatomic) NSString *demIdLot;
@property (retain,nonatomic) NSString *demDescriptif;
@property (retain,nonatomic) NSString *demStatut;
@property (retain,nonatomic) NSString *demTitle;
@property (retain,nonatomic) NSString *demCreated;
@property (retain,nonatomic) NSString *demAuteur;
@property (retain,nonatomic) NSString *demIdAuteur;
@property (retain,nonatomic) NSString *demLoginAuteur; 
@end


#import "Demande.h"
@implementation Demande

@synthesize demId,demIdCopro,demIdImmeuble,demIdLot,demDescriptif,demStatut,demTitle,demCreated,demAuteur,demIdAuteur,demLoginAuteur;

- (void)dealloc {	
/*
	[demId release];
	[demIdCopro release];
	[demId release];
	[demIdImmeuble release];
	[demIdLot release];
	[demDescriptif release];
	[demStatut release];
	[demTitle release];
	[demCreated release];
	[demAuteur release];
	[demIdAuteur release];
	[demLoginAuteur release];	 
	[super dealloc];
*/
}
@end


Si je ne release pas les attributs de la demande dans le dealloc (comme ci-dessus) alors je peux faire un removeAllObjects depuis MyTableViewController. Je n'ai plus de fuites au niveau des objets insérés dans le tableau.

Mais alors ces strings ne sont jamais release. Et j'ai donc autant de fuites sur des strings que de demandes*les attributs_de_la_demande.

Je pense que le removeAllObject essaie de liberer les attributs de l'objets demande et que s'ils ont déjà été release alors l'appli plante.
 
le copy dans les properties n'a pas fonctionné.

je vais regarder le lien que tu m'as donné.

en attendant d'autres idées arrivent je testerai volontiers direct.

---------- Nouveau message ajouté à 14h25 ---------- Le message précédent a été envoyé à 13h57 ----------

Est ce que les properties de l'objet dem sont released quand je fais dem release ? Mon tab_Demandes ne contient que des pointeurs donc cela peut venir de là?
 
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 ?
 
La console n'indique rien quand ca plante ?

pour ma part, je ferais le removeAllObjects dans le requestDReloadDone, mais ca ne doit rien changer...