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 :

Précision sur la gestion de la mémoire


Sujet :

Objective-C

  1. #1
    Candidat au Club
    Inscrit en
    Décembre 2008
    Messages
    2
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 2
    Points : 2
    Points
    2
    Par défaut Précision sur la gestion de la mémoire
    Bonjour,

    Je suis en train d'apprendre l'objective C et le développement Iphone. Ma bête noire en ce moment, c'est la gestion de la mémoire.

    Voici, un exemple qui me pose problème parmi d'autres :

    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
    - (void)setBalise:(id)sender{
    	NSMutableString *str = [self.text mutableCopy];
    	NSRange r = [self selectedRange];
     
    	if (r.location == NSNotFound) {
    		return;
    	}
     
    	NSString *selectedStr = [str substringWithRange:r];
    	NSString *newStr = [NSString stringWithFormat:@"<mabalise>%@</mabalise>", selectedStr];
    	[str replaceCharactersInRange:r
    						withString:newStr];
     
    	self.text = str;
     
    }
    Dans ce code, peut importe son fonctionnement, je vois que l'on a recours à des NSString, à des NSRange, mais à aucun moment on ne fais de release une fois qu'on a fini de les utiliser.

    Pourriez-vous m'expliquer pourquoi ?

  2. #2
    Membre à l'essai
    Profil pro
    Inscrit en
    Septembre 2011
    Messages
    13
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 13
    Points : 10
    Points
    10
    Par défaut
    le release faut le mettre dans la fonction viewdidunload....

  3. #3
    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 cypher90 Voir le message
    Bonjour,

    Je suis en train d'apprendre l'objective C et le développement Iphone. Ma bête noire en ce moment, c'est la gestion de la mémoire.

    Voici, un exemple qui me pose problème parmi d'autres :

    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
    - (void)setBalise:(id)sender{
    	NSMutableString *str = [self.text mutableCopy];
    	NSRange r = [self selectedRange];
     
    	if (r.location == NSNotFound) {
    		return;
    	}
     
    	NSString *selectedStr = [str substringWithRange:r];
    	NSString *newStr = [NSString stringWithFormat:@"<mabalise>%@</mabalise>", selectedStr];
    	[str replaceCharactersInRange:r
    						withString:newStr];
     
    	self.text = str;
     
    }
    Dans ce code, peut importe son fonctionnement, je vois que l'on a recours à des NSString, à des NSRange, mais à aucun moment on ne fais de release une fois qu'on a fini de les utiliser.

    Pourriez-vous m'expliquer pourquoi ?
    1. vous avez le "Build And Analyze" qui va vous dire si vous faites des erreurs dans la gestion mémoire en tenant compte de comment vos "property" sont déclarées (ce qui manque ici dans ce que vous montrez) (analyse statique de votre code source)

    2. NSRange n'est pas un NSObject mais une simple "struct" et n'est donc pas concerné par la gestion mémoire

    3. mutableCopy renvoie un objet avec un retain count de 1, sortir par "return" sans le "release" est donc un memory leak
    et a priori en considérant les conventions habituelles pour une property comme "text", qui devrait être "retain",
    self.text = str va augmenter encore le retain count de 1.

    Solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	NSMutableString *str = [[self.text mutableCopy] autorelease] ;
    et il serait mieux de copier l'objet seulement s'il y a quelque chose à faire : déplacez cette ligne après le test sur r.location.

    4. substringWithRange et stringWithFormat renvoient des autoreleased : donc pas de problème pour eux

    5. replaceCharactersInRange est une méthode de NSMutableString et non de NString : vous devez donc utiliser stringByReplacingCharactersInRange :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.text = [str stringByReplacingCharactersInRange:r withString:newStr] ;
    (si "text" est bien une property avec l'attribut "retain" - sinon il faut un ajouter un appel à "retain").

    NB
    a. Toutes les conventions de noms des méthodes en fonction du retour "retain-ed" ou "autorelease-d" sont expliquées dans la documentation sur le site d'Apple.

    b. avec XCode 4, il est aussi possible d'utiliser les techniques liées à l'"Automatic Reference Counting" : voir la session 323 de la WWDC 2011 : le compilateur va s'occuper des retain/release et forcer le respect des conventions.

Discussions similaires

  1. Réponses: 5
    Dernier message: 11/04/2014, 17h01
  2. Questions sur la gestion de la mémoire
    Par Graimbault dans le forum Administration système
    Réponses: 0
    Dernier message: 20/04/2012, 15h48
  3. Question sur la gestion de la mémoire
    Par angelocoupet dans le forum Linux
    Réponses: 2
    Dernier message: 03/01/2011, 18h43
  4. questions sur la gestion de la mémoire
    Par Anouschka dans le forum Débuter
    Réponses: 9
    Dernier message: 26/08/2007, 20h44
  5. Question sur la gestion mémoire
    Par rem02 dans le forum Langage
    Réponses: 7
    Dernier message: 06/01/2007, 22h06

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