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 :

Aide à la compréhension sur les retain, release, copy etc


Sujet :

Objective-C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 9
    Points : 6
    Points
    6
    Par défaut Aide à la compréhension sur les retain, release, copy etc
    Bonjour,

    Je débute dans la programmation iOS et je vous avoue que j'ai un peu de mal avec la gestion de la mémoire.

    Dans les différents tutos que j'ai lu, je trouve qu'il n'y a aucune explication sur
    la différence entre le retain, le copy...
    Dans les @property je ne comprends pas non plus la différence entre les différents termes (retain, assign, copy etc...)

    Pourquoi des ivars dans la classe sans mettre de @property ??

    Pourquoi faire des self.myIvar = .... alors que des fois on voit myIvars = ....


    Merci de m'éclairer un petit peu..

  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 an.be Voir le message
    Bonjour,

    Je débute dans la programmation iOS et je vous avoue que j'ai un peu de mal avec la gestion de la mémoire.

    Dans les différents tutos que j'ai lu, je trouve qu'il n'y a aucune explication sur
    la différence entre le retain, le copy...
    ne perdez pas de temps avec des tutos dont vous n'avez aucune garantie sur le sérieux des auteurs : la seule source fiable est la documentation d'Apple et les vidéos des conférences WWDC (disponibles aussi via iTunes)

    Citation Envoyé par an.be Voir le message
    Dans les @property je ne comprends pas non plus la différence entre les différents termes (retain, assign, copy etc...)
    @property sert à donner des directives au compilateur pour générer du code implicite : les getters et setters.
    retain, assign et copy sont des instructions sur comment les getter/setter doivent se comporter :
    retain : la classe est "propriétaire" de l'ivar et en fait un retain lors du setter, le code du setter est généré de telle manière qu'il soit "save" en toute circonstance, y compris si le paramètre est égal à l'ivar elle-même (il n'y aura pas de release de l'ivar avant le retain de la nouvelle valeur).

    assign: la classe ne se considère pas comme propiétaire de l'ivar, c'est l'appelant qui est responsable du cycle de vie de la variable passée en argument du setter

    copy: la classe utilise toujours une copie de la variable donnée et s'en considère "propriétaire"

    Citation Envoyé par an.be Voir le message
    Pourquoi des ivars dans la classe sans mettre de @property ??
    pas de getters/setters générés : à vous de les implémenter manuellement si nécessaire.

    Citation Envoyé par an.be Voir le message
    Pourquoi faire des self.myIvar = .... alors que des fois on voit myIvars = ....
    la première forme invoque le setter pas la seconde, s'il n'y a pas de setter défini pour l'ivar les 2 font la même chose.

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Merci pour cette réponse et des conseils !

    J'ai encore une question :
    Qauand je déclare un IBOutlet UIImageView * image; dans le .h de mon ViewController, je suis obligé de lui mettre le @property (nonatomic, retain) UIImageView * image; ???

    et dans le viewDidUnload je dois faire self.image = nil; ??

    Merci encore

  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 an.be Voir le message
    Merci pour cette réponse et des conseils !

    J'ai encore une question :
    Qauand je déclare un IBOutlet UIImageView * image; dans le .h de mon ViewController, je suis obligé de lui mettre le @property (nonatomic, retain) UIImageView * image; ???
    seulement si vous avez l'intention dans votre code de manipuler dynamiquement la structure de votre vue…

    Citation Envoyé par an.be Voir le message
    et dans le viewDidUnload je dois faire self.image = nil; ??

    Merci encore
    sous iOS, il peut être intéressant de le faire du point de vue de la gestion mémoire,
    MAIS
    cela implique de comprendre de qui se passe et que vous soyez capable de reconstruire votre vue à la demande…

  5. #5
    Futur Membre du Club
    Profil pro
    Inscrit en
    Octobre 2011
    Messages
    9
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2011
    Messages : 9
    Points : 6
    Points
    6
    Par défaut
    Ok, en fait je n'ai pas besoin de manipuler mon image, elle me sert de fond.

    Donc pas besoin de @property ok !
    et je peux donc utiliser le self.image = nil; sans soucis ?

  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 an.be Voir le message
    Ok, en fait je n'ai pas besoin de manipuler mon image, elle me sert de fond.

    Donc pas besoin de @property ok !
    et je peux donc utiliser le self.image = nil; sans soucis ?
    cette question n'a de sens que si l'on connaît le cycle de vie complet de la vue qui contient la vue Image…

    par contre ce que vous pouvez certainement faire c'est libérer l'image de la vue image
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    self.image.image = nil ;
    ce qui met en évidence votre mauvaise pratique dans le nommage des objets :
    la façon suivante (parmi d'autres…) de nommer les IBOutlet est préférable :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    IBOutlet UIImageView *ibBackgroundView ;
    préfixe: ib => c'est un outlet défini dans Interface Builder
    corps : Background => exprime la fonction de l'objet
    suffixe : View => c'est une vue…

    (l'air de rien une pratique cohérente dans les noms des ivars réduit le taux d'erreurs "stupides" de manière drastique, et pas seulement les erreurs de frappe…)

Discussions similaires

  1. Réponses: 7
    Dernier message: 21/10/2007, 01h50
  2. aide pour exercice sur les structures
    Par demetria dans le forum C
    Réponses: 10
    Dernier message: 25/09/2007, 22h11
  3. Réponses: 2
    Dernier message: 18/04/2007, 15h40
  4. recherche aide et conseils sur les tables
    Par jj77 dans le forum Langage
    Réponses: 1
    Dernier message: 10/01/2007, 23h24
  5. [Smarty] problème compréhension sur les tableaux
    Par mohican13 dans le forum Bibliothèques et frameworks
    Réponses: 11
    Dernier message: 09/02/2006, 16h44

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