Recherche d'une fuite...

Alf1996Alf1996 Membre
02:14 modifié dans Apple Developer Programs #1
Bonsoir,
Je suis en train de rechercher une fuite sur mon application, alors je l'ai fait tourner pendant environ 1 minute avec "Run with performance tool / leaks" en cliquant un peu partout. D'après ce que je vois, il y a fuite ! J'ai également constaté que la fuite apparaissait à  chaque click sur un segmented control (toujours le même), donc je me dis que la recherche devrait être facile, mais je bloque sur les informations qui sont données sur la fenêtre... Quelqu'un pourrait-il m'éclairer ?
Merci d'avance.  o:)

J'essaie de joindre une copie d'écran...

Réponses

  • muqaddarmuqaddar Administrateur
    02:14 modifié #2
    On pourrait aussi avoir le code appelé lorsque tu cliques sur le segmented control ?
  • Alf1996Alf1996 Membre
    02:14 modifié #3
    <br /><br />-(IBAction) changeConfig:(id)sender{<br />if (sender==appareil) {<br />	if (appareil.selectedSegmentIndex==0) {<br />		self.avionSel=@&quot;A318&quot;;<br />	}else if (appareil.selectedSegmentIndex==1) {<br />		self.avionSel=@&quot;A319&quot;;<br />	}else {<br />		self.avionSel=@&quot;A320&quot;;<br />	}<br /><br />}else if (sender==flaps) {<br />	if (flaps.selectedSegmentIndex==0) {<br />		self.voletsSel=@&quot;V1&quot;;<br />	}else {<br />		self.voletsSel=@&quot;V2&quot;;<br />	}<br />}else {<br />	if (etatPiste.selectedSegmentIndex==0) {<br />		self.etatPisteSel=@&quot;Dry&quot;;<br />	}else {<br />		self.etatPisteSel=@&quot;Wet&quot;;<br />	}	<br />}<br />	// Relecture des dictionnaires<br />	[self lectureDicos];<br /><br />}<br /><br />-(void)lectureDicos{<br />	NSString *filePath = [self pathListe:@&quot;Terrains&quot;:self.avionSel:self.voletsSel:self.etatPisteSel];<br />	NSMutableDictionary *dico1 = [[NSMutableDictionary alloc]initWithContentsOfFile:filePath];<br />	self.dicoPistes = [dico1 copy];<br />	[dico1 release];<br />	<br />	NSString *filePath2 = [self pathListe:@&quot;Bretelles&quot;:self.avionSel:self.voletsSel:self.etatPisteSel];<br />	NSMutableDictionary *dico2 = [[NSMutableDictionary alloc]initWithContentsOfFile:filePath2];<br />	self.dicoBretelles = [dico2 copy];<br />	[dico2 release];<br />	<br />	self.listeTerrains =[[self.dicoPistes allKeys]sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];<br />}<br /><br />-(NSString *)pathListe:(NSString *)typeListe:(NSString *)nomAvion:(NSString *)braqVolets:(NSString *)etPiste{<br />	NSString *documentFolder = typeListe;<br />	documentFolder=[[[documentFolder stringByAppendingString:nomAvion] stringByAppendingString:braqVolets] stringByAppendingString:etPiste];<br />	return [[NSBundle mainBundle] pathForResource:documentFolder ofType:@&quot;plist&quot;];<br />}<br /><br />
    


    Voila, j'espère avoir mis tout ce qui peut servir... En fait, il semble que la fuite n'apparaisse que lorsque je clique sur le segmentedControl "appareil". Ce qui me surprend, c'est qu'il se passe la même chose (au niveau du code) que lorsqu'on clique sur l'un des deux autres SegmentedControls, or il n'y a pas de fuites sur les deux autres...

    Je crois que le problème doit se situer dans la relecture des dictionnaires... J'ai un peu galéré avec les NSMutableDictionnary et j'ai dû me compliquer la vie... !!!  >:)

    Merci en tout cas si tu peux m'éclairer...  :P
  • muqaddarmuqaddar Administrateur
    02:14 modifié #4
    Tu as des retain sur tes propriétés de dico ?
    As-tu une bonne raison de faire une copie ?


    Cecie ne serait pas mieux:

    self.dicoPistes = [[[NSMutableDictionary alloc] initWithContentsOfFile:filePath] autorelease];
    


    à  la place de :

    NSMutableDictionary *dico1 = [[NSMutableDictionary alloc]initWithContentsOfFile:filePath];<br />	self.dicoPistes = [dico1 copy];<br />	[dico1 release];
    


    en partant du principe que tu as mis un retain en déclarant dicoPistes.
  • Alf1996Alf1996 Membre
    02:14 modifié #5
    Merci de me répondre si vite...
    J'ai effectivement un retain à  la déclaration de dicoPistes car j'en ai besoin régulièrement pour faire tourner un pickerView. Dans mon .h, j'ai ceci :

    <br />@property(retain,nonatomic) NSDictionary *dicoPistes;<br />@property(retain,nonatomic) NSDictionary *dicoBretelles;<br />
    


    J'ai utilisé la copie car je n'arrivais pas à  lire directement le dico à  partir du plist, mais je crois que je n'avais pas mis "autorelease". Je n'avais pas compris son utilisation. Alors, juste pour confirmer, cela me permets de ne pas mettre [dicoPistes release] et à  chaque fois que je fais un nouvel alloc, il fait tout seul le release avant d'attribuer une nouvelle valeur ? Sachant que je ne peux pas faire de release, vu que j'ai besoin de mon dico...
    Si c'est bien çà , je viens enfin de comprendre un point crucial sur la gestion des variables et de la mémoire...  :o

    Merci encore Muqaddar
  • Alf1996Alf1996 Membre
    02:14 modifié #6
    Après essai, c'était bien çà  le problème. J'ai fait tourner pendant 2 minutes en cliquant partout et surtout sur le segmentedControl qui me déclenchait des fuites, et plus rien : 0 FUITE. 

    T'es vraiment trop fort (et moi trop nulle !  >:) )

    Encore merci de répondre à  des questions que tu dois trouver super bête...  :p
  • muqaddarmuqaddar Administrateur
    02:14 modifié #7
    La gestion mémoire est capitale en Objective-C.
    Tu t'y intéresses et notamment aux fuites, et c'est un excellent point.

    Comme tu déclares une propriété retain sur ta variable, il faut absolument que tu envoies un objet autoreleasé lorsque tu utilises le setter, sinon il y aurait un double retain, donc une fuite mémoire.
  • Alf1996Alf1996 Membre
    02:14 modifié #8
    dans 1307261935:

    La gestion mémoire est capitale en Objective-C.


    C'est ce que j'avais compris, c'est pourquoi j'ai passé un bon moment à  chercher cette fuite... Je pense que même si j'y ai passé pas mal de temps, ce n'était pas du luxe... Cela m'a permis de comprendre, du moins je l'espère, ce que j'avais lu à  maintes reprise... sans rien comprendre apparemment ! Mais avec cet exemple concret c'était vraiment beaucoup plus clair... J'espère que ce post permettra à  d'autres nioubs d'y voir plus clair également...  :o



    Comme tu déclares une propriété retain sur ta variable, il faut absolument que tu envoies un objet autoreleasé lorsque tu utilises le setter, sinon il y aurait un double retain, donc une fuite mémoire.


    OK merci beaucoup pour ces éclaircissements... 
Connectez-vous ou Inscrivez-vous pour répondre.