IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Objective-C Discussion :

j'ai un Memory leak Method returns an objective-C obbject with a +1


Sujet :

Objective-C

  1. #1
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut j'ai un Memory leak Method returns an objective-C obbject with a +1
    Bonjour
    je suis entrain de déboguer mon application et j'ai un Memory leak dans la ligne en rouge

    Method returns an objective-C obbject with a +1 retain count(owning reference)

    ->Object allocated on line 201 is no longer referenced after this point and has a retain count of +1(object leaked)

    j'utilise la classe XMLToObjectParser
    http://www.ipup.fr/page.php?id=332


    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    - (void)viewDidLoad {
    	
    	tableau = [[NSMutableArray alloc] init];
    	NSURL *url = [NSURL URLWithString: @"http://www.site.com/feed.xml"];
    	
    	XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@"eventLoc" andDenominator:@"eventLoc" parseError:nil];
    	
    		
    	for(int i = 0; i < [[myParser items] count]; i++) {
    		//eventLoc *new = [[eventLoc alloc] init];
    		eventLoc *new = (eventLoc *)[[myParser items] objectAtIndex:i];
    		[tableau addObject:new];
    		 
    	}
    	 //[myParser release]; 
    	[super viewDidLoad];
       
    }
    je ne sais pas vraiment comment résoudre ce memory leak

    Merci d'avance pour votre m'aider

  2. #2
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par sculpteur Voir le message
    Bonjour
    je suis entrain de déboguer mon application et j'ai un Memory leak dans la ligne en rouge

    Method returns an objective-C obbject with a +1 retain count(owning reference)

    ->Object allocated on line 201 is no longer referenced after this point and has a retain count of +1(object leaked)

    j'utilise la classe XMLToObjectParser
    http://www.ipup.fr/page.php?id=332


    Voici mon code
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    - (void)viewDidLoad {
    	
    	tableau = [[NSMutableArray alloc] init];
    	NSURL *url = [NSURL URLWithString: @"http://www.site.com/feed.xml"];
    	
    	XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@"eventLoc" andDenominator:@"eventLoc" parseError:nil];
    	
    		
    	for(int i = 0; i < [[myParser items] count]; i++) {
    		//eventLoc *new = [[eventLoc alloc] init];
    		eventLoc *new = (eventLoc *)[[myParser items] objectAtIndex:i];
    		[tableau addObject:new];
    		 
    	}
    	 //[myParser release]; 
    	[super viewDidLoad];
       
    }
    je ne sais pas vraiment comment résoudre ce memory leak

    Merci d'avance pour votre m'aider
    enlevez le // devant [myParser release]

  3. #3
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    oui j'ai déjà essayé ça

    si j'enlève le commentaire(//):
    Method returns an objective-C obbject with a +0 retain count(non-owning reference)

    ->incorrect decrement of the reference count of an object is not owned at this point by the caller
    si je le laisse:

    Method returns an objective-C obbject with a +1 retain count(owning reference)

    ->Object allocated on line 201 is no longer referenced after this point and has a retain count of +1(object leaked)

  4. #4
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par sculpteur Voir le message
    oui j'ai déjà essayé ça

    si j'enlève le commentaire(//):


    si je le laisse:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@"eventLoc" andDenominator:@"eventLoc" parseError:nil];
    ne respecte pas les conventions : c'est pour cela que l'analyseur ne peut donner de messages cohérents…

    soit

    vous avez myParser = [[… alloc] initXXXX:…]
    et ensuite [myParser parseXMLAtURL:…]
    et enfin [myParser release]

    soit parseXMLAtURL est une méthode de classe et non d'instance et vous avez

    [XMLToObjectParser parseXMLAtURL:…]

    et rien d'autre car dans ce cas la convention est que parseXMLAtURL retourne une instance autoreleased…

  5. #5
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    Citation Envoyé par JeitEmgie Voir le message
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XMLToObjectParser *myParser = [[XMLToObjectParser alloc] parseXMLAtURL:url toObject:@"eventLoc" andDenominator:@"eventLoc" parseError:nil];
    ne respecte pas les conventions : c'est pour cela que l'analyseur ne peut donner de messages cohérents…

    soit

    vous avez myParser = [[… alloc] initXXXX:…]
    et ensuite [myParser parseXMLAtURL:…]
    et enfin [myParser release]

    soit parseXMLAtURL est une méthode de classe et non d'instance et vous avez

    [XMLToObjectParser parseXMLAtURL:…]

    et rien d'autre car dans ce cas la convention est que parseXMLAtURL retourne une instance autoreleased…

    et vous pensez que c'est nécessaire de respecter les conventions?
    et si je dois les respecter?
    comment je dois procéder pour completer celle ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myParser = [[… alloc] initXXXX:…]
    initXXXX ??


    Merci beaucoup JeitEmgie pour tes éclaircissements

  6. #6
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par sculpteur Voir le message
    et vous pensez que c'est nécessaire de respecter les conventions?
    et si je dois les respecter?
    faut-il répondre à une telle question ?

    Citation Envoyé par sculpteur Voir le message
    comment je dois procéder pour completer celle ligne
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myParser = [[… alloc] initXXXX:…]
    initXXXX ??
    aucune idée : je n'ai pas les sources de XMLToObjectParser, à vous de lire sa documentation…
    et s'il n'y a pas de initXXX… faites simplement
    myParser = [[XMLToObjectParser alloc] init] ;

  7. #7
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    faut-il répondre à une telle question ?
    je parle lors de l'envoie de l'application pour être validée, est ce qu'ils exigent çà


    J'ai essayé çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myParser = [[XMLToObjectParser alloc] init] ;
    mais j'ai une autre erreur:
    Value stored to 'myParser' during its initialization is never read

    la classe myparser est ici:

  8. #8
    Expert confirmé
    Homme Profil pro
    Inscrit en
    Septembre 2006
    Messages
    2 937
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2006
    Messages : 2 937
    Points : 4 358
    Points
    4 358
    Par défaut
    Citation Envoyé par sculpteur Voir le message
    je parle lors de l'envoie de l'application pour être validée, est ce qu'ils exigent çà


    J'ai essayé çà:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    myParser = [[XMLToObjectParser alloc] init] ;
    mais j'ai une autre erreur:
    Value stored to 'myParser' during its initialization is never read

    la classe myparser est ici:
    Passons sur le fait que le problème n'est pas reproductible ici…
    ce qui laisse supposer qu'entre ce que vous faites réellement et ce que vous postez il y a une différence.

    Pour faire au plus court :

    1. Changer le nom de la méthode parseXMLAtURL par initWithXMLAtURL et faites
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XMLToObjectParser *myParser = [[XMLToObjectParser alloc] initWithXMLAtURL:…] ;
    2. laissez la ligne [myParser release] SANS commentaire
    3. pour être strict la première ligne de initWithXMLAtURL devrait être :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    - (id)initWithXMLAtURL: …
    {
        self = [super init] ;
        …
    et il n'y aura plus de warning de l'analyseur (qui ne sont QUE des warnings…)


    NB

    Le code sur ipub.fr étant un exemple de mauvaises pratiques,
    donc toujours en ayant renommé parseXMLAtURL en initWithXMLAtURL :
    une méthode s'appelant "parseXMLAtURL" devant être une méthode de classe renvoyant une instance auto-released :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    + (id)parseXMLAtURL: …
    {
        return [[[self alloc] initWithXMLAtURL: …] autorelease] ;
    }
    qu'on invoquerait alors ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    XMLToObjectParser *myParser = [XMLToObjectParser parseWithXMLAtURL:…] ;
    sans devoir faire de [myParser release] plus loin.

  9. #9
    Membre régulier
    Inscrit en
    Mars 2007
    Messages
    120
    Détails du profil
    Informations forums :
    Inscription : Mars 2007
    Messages : 120
    Points : 76
    Points
    76
    Par défaut
    c'est résolu grâce a toi JeitEmgie

    Merci beaucoup

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Compilation TAO / Mfc : Memory Leaks
    Par Rolsct dans le forum CORBA
    Réponses: 4
    Dernier message: 17/04/2005, 19h13
  2. [MFC] Thread & memory leaks
    Par Racailloux dans le forum MFC
    Réponses: 7
    Dernier message: 15/03/2005, 12h44
  3. Memory leak en C/C++
    Par Roswell dans le forum Autres éditeurs
    Réponses: 6
    Dernier message: 07/07/2004, 19h41
  4. [MFC] A la chasse au memory leak
    Par Yabo dans le forum MFC
    Réponses: 17
    Dernier message: 27/06/2004, 17h35
  5. Réponses: 7
    Dernier message: 26/02/2004, 09h32

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo