Leaks of memory
saukeguy
Membre
Bonjour a tous je travaille actuellement sur un projet XCode avec Objective C.
J'essaye de rendre mon programe dès le depart le plus lisible possible et sans fuite de mémoire ou probléme d'allocation.
Premierement j'ai utilisé clang afin d'identifir mes fuites mémoires et de les résoudre sur celui-ci je n'en est plus aucune. J'ai donc ensuite lancé mon programme via leaks mais celui-ci continue à afficher une fuite mémoire de type appkit et une d'un autre type dont je n'arrive pas à la résoudre.
Voici mon code :
Ne faites surtout pas attention au nommage des méthode qui comporte des majuscules ni au commentaire qui des fois sont en franglais, tout ceux- ci sera remanié dès que j'aurais résolu ce problème.
Dans ce fichier j'ai créer des méthodes qui vont me permettre d'ajouter, modifier,supprimer ou bien selectionner des champs dans une d mes base de données.
Voici souligner en rouge les erreur d'allocations que leaks prend en compte ainsi que d'autre erreurs de type NCFString de l'appkit apple et je ne sait pas pourquoi. Pourtant clang persiste et ne me donne aucune fuite mémoire.
methode_sql.m
Comme je l'aidit précédemment aucun problème au niveau de clang mais au niveau de leaks c'est une autre histoire. Merci de vos futurs réponses si je fait nimporte quoi sur ce coe s'il vous plaà®t de me lsignaler et de me donner des elements afin de m'améliorer. Désoler du surplus d'informations et je tiens a préciser que la fuite mémoire apparait quand je fait plusieurs fois la même opération et jamais au premier clique.
Merci d'avance pour vos futurs réponses
J'essaye de rendre mon programe dès le depart le plus lisible possible et sans fuite de mémoire ou probléme d'allocation.
Premierement j'ai utilisé clang afin d'identifir mes fuites mémoires et de les résoudre sur celui-ci je n'en est plus aucune. J'ai donc ensuite lancé mon programme via leaks mais celui-ci continue à afficher une fuite mémoire de type appkit et une d'un autre type dont je n'arrive pas à la résoudre.
Voici mon code :
Ne faites surtout pas attention au nommage des méthode qui comporte des majuscules ni au commentaire qui des fois sont en franglais, tout ceux- ci sera remanié dès que j'aurais résolu ce problème.
Dans ce fichier j'ai créer des méthodes qui vont me permettre d'ajouter, modifier,supprimer ou bien selectionner des champs dans une d mes base de données.
Voici souligner en rouge les erreur d'allocations que leaks prend en compte ainsi que d'autre erreurs de type NCFString de l'appkit apple et je ne sait pas pourquoi. Pourtant clang persiste et ne me donne aucune fuite mémoire.
methode_sql.m
<br />
//<br />
// valorisation_sql.m<br />
// projet_adit<br />
//<br />
// Created by Reims_04 on 25/04/12.<br />
// Copyright 2012 ADIT Champagne-Ardenne. All rights reserved.<br />
//<br />
#import "methode_sql.h"<br />
@implementation methode_sql<br />
<br />
//Initialisation du path de l'une des bdd<br />
-(void) initBDDPath:(int) numBDD{<br />
//Nom de la base de données<br />
if(numBDD==1)<br />
databaseName = @"/projet_adit/valorisation";<br />
else if(numBDD==2)<br />
{<br />
databaseName = @"/projet_adit/main";<br />
}<br />
else if(numBDD==3)<br />
{<br />
databaseName = @"/projet_adit/questionnaire";<br />
}<br />
// Obtenir le chemins complet de la base de donées<br />
NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);<br />
NSString *documentsDir = [documentPaths objectAtIndex:0];<br />
databasePath = [documentsDir stringByAppendingPathComponent:databaseName];<br />
/*Voici le probleme d'après XCode leaks*/<br />
<br />
[color=#ff0000]result = [[[NSString alloc]init]autorelease];<br />
aatier = [[[NSMutableDictionary alloc]init]autorelease];<br />
//Methode general de navigation de boite de dialogue et d'attribution d'une plage de date pour les NSDatePicker<br />
pool = [[general_methode alloc]init];[/color]<br />
<br />
}<br />
<br />
-(void) dealloc{<br />
[pool release];<br />
[super dealloc];<br />
}<br />
<br />
<br />
Comme je l'aidit précédemment aucun problème au niveau de clang mais au niveau de leaks c'est une autre histoire. Merci de vos futurs réponses si je fait nimporte quoi sur ce coe s'il vous plaà®t de me lsignaler et de me donner des elements afin de m'améliorer. Désoler du surplus d'informations et je tiens a préciser que la fuite mémoire apparait quand je fait plusieurs fois la même opération et jamais au premier clique.
Merci d'avance pour vos futurs réponses
Connectez-vous ou Inscrivez-vous pour répondre.
Réponses
Puisque des fuites ont été détectées, dis-nous où.
Aurais tu une petite copie d'écran de ce que te donne Instruments/leaks? Parce que là , comme dit Ceroce, on veut bien aider, mais on ne vas pas pouvoir regarder tout ton code ! /wink.png' class='bbc_emoticon' alt=';)' />
à‰dit :
http://forum.cocoacafe.fr/forum/17-presentation-des-membres/
Bizarre, ça n'a pas l'air d'être le même code que sur MacGé, enfin y'a methode_sql.m et pas d'autres...
Qu'est ce que tu fais ensuite avec ces variables ?
Et n'oublie pas d'aller te présenter...
Ah oui... T'as pas eu ta réponse sur MacGe... Alors tu essayes ici ?!!!
Result quand a lui me permet de retourner un châine de caractère qui correspond au format de la requete de base de que je veut lorsque je fait la même selection. Pourquoi je ne devrais pas les mettre en autorelease? Puisque toutes les deux sont des variables de renvoies je ne sait donc pas eactement quand les détruire??
Oui c'est bien évident, j'essaye de me débrouiller. Le problème est que sur mac génération on ma traité, pourtant je suis de bonne fois et j'essaye de lire un peu tout ce qu'on me donne mais aucun réponse me convenant ne m'a était donné . Mais de la a dire que j'ai fait du copier/ coller de code. Il est vrai que je me suis inspiré dun code existant mais celui- ci je l'ai réalisé en son intégralité.
Les méthodes d'init ne s'écrivent jamais ainsi. Il faut utiliser la forme idiomatique:
Ensuite, la méthode s'appelle initWithBDDPath:, alors on attend une NSString comme argument puisqu'un chemin de fichier est stocké dans une NSString.
Utiliser des constantes en dur (==1) est une mauvaise idée. Regarde sur le net comment déclarer des énumérations en C (mot clé enum). Regarde aussi switch... case pendant que tu y es.
-[NSString stringByAppendingPathComponent:], comme toutes les méthodes dont le nom ne commence pas par alloc, init, new ou copy, renvoie un objet autoreleasé.
De fait, il va disparaà®tre au prochain cycle, et il est anormal de le stocker dans une variable d'instance. databasePath pointera à la fin du cycle sur un objet qui n'existera plus.
Une NSString n'est pas modifiable. Ce code ne sert donc à rien, mais il crée une fuite, pour la même raison que ci-dessus: une variable d'instance pointe sur un objet autoreleasé.
Même erreur.
pool, c'est pas terrible comme nom, parce que ça évoque l'autorelease pool.
P.S.: L'ambiance est à chier sur le forum de dev de MacGé. Et puis, j'en ai marre de répondre à des gens pas sérieux.
C'est vrai... Quelle ambiance !!!
Oui, [url="http://www.cocoa.fr/tag-mémoire/"]parce que l'autorelease pool a un fonctionnement cyclique[/url].
mais je suppose que la methode initWithWindowNibName est ue methode de classe donc automatiuement autoreleasé non?
Bien !
Maintenant, seconde phase, trouver et corriger les fôtes d'orthographe...
Bon et bien je n'arrive pas a résoudre cette fuite mémoire qui d'après ce que j'ai compris ne se produit que lorsqu'il y utilisation de NSTextField. Est-ce un bug non corriger de Apple puisque j'utilise la version 3.2 de XCode ou bien est-ce autre chose? Si quelqu'un a ou a eu le même problème, merci de me le signaler.
Voici comment je récupère la chaà®ne de caractère saisie. Je release bien évidemment le NSString à la fin de ma méthode.
Cela fait deux jour que je suis penché dessus et ça ne m'avance guère. Si certains on une piste.
Certainement pas.
Tout d'abord initWithWindowNibName n'est pas une méthode de classe, mais une méthode d'instance: Elle est exécutée sur l'instance crée par la méthode de classe alloc.
Ensuite, les conventions de nommage, qui font loi dans la gestion mémoire (revoir la documentation adéquate), précisent bien que les méthodes commençant par "init" (entre autre) effectuent un transfert de propriété de l'objet retourné à l'appelant. Par conséquent, l'objet retourné n'est pas "autoreleasé".
Quoi qu'il en soit, le fait qu'une méthode soit ou non une méthode de classe ne change en rien la convention de nommage. Donc une méthode de classe dont le nom commençerait par "init" ne retournerait pas non plus d'objet autoreleasé.