84 votes

Objectif C - Assigner, copier, conserver

Je suis nouveau à l'Objectif C. J'ai des connaissances de base en C, y compris le concept de pointeurs. J'ai deux questions de base:

  1. Quelqu'un peut-il expliquer la différence entre assigner, copier et conserver avec une certaine analogie?
  2. Comment gérez-vous une fonction qui renvoie une variable de pointeur et comment effectuez-vous la messagerie via un pointeur de retour?

127voto

Joshua Nozzi Points 38718

Mise à jour de Répondre à toute modification de la Documentation

L'information est maintenant répandu à travers plusieurs guides dans la documentation. Voici une liste de lectures obligatoires:

La réponse à cette question dépend entièrement de vous utilisez un ARC-application gérée (la moderne par défaut pour les nouveaux projets) ou en forçant le manuel de gestion de la mémoire.

Attribuer vs Faible Utilisation d'attribuer à définir une propriété du pointeur vers l'adresse de l'objet sans conservant ou autrement commissariat; utilisation faible pour avoir la propriété de point à zéro automatiquement si l'objet assigné à il est libéré. Dans la plupart des cas, vous aurez envie d'utiliser la faiblesse de sorte que vous êtes, ne pas essayer d'accéder à une désallocation de l'objet (accès illégal d'une adresse de mémoire - "EXC_BAD_ACCESS") si vous n'avez pas effectuer un nettoyage convenable.

Conserver vs Copie Déclarées propriétés utilisation de conserver par défaut (de sorte que vous pouvez simplement l'omettre complètement) et de gérer la référence de l'objet compter automatiquement si un autre objet est affecté à la propriété ou qu'il est défini à zéro; l'Utilisation de la copie d'envoyer automatiquement le nouvel objet a -copy message (qui va créer une copie de l'objet passé et d'attribuer cette copie à la propriété plutôt utile (voire nécessaire) dans certains cas où l'objet affecté peut être modifié après avoir été définie comme une propriété d'un autre objet (ce qui voudrait dire que la modification/la mutation s'appliquerait à la propriété).

34voto

hipplar Points 3185

La Gestion de la Mémoire Guide de Programmation à partir de l'iOS Bibliothèque de Référence a bases de céder, copier, et de le conserver avec des analogies et des exemples.

copie Fait une copie de l'objet, et le renvoie à conserver le compte de 1. Si vous copiez un objet, vous êtes propriétaire de la copie. Ceci s'applique à toute méthode qui contient le mot copie où "copier" se réfère à l'objet retourné.

conserver les Augmentations de conserver le comte d'un objet de 1. Prend possession de un objet.

libération Diminue de conserver le comte d'un objet de 1. Renonce la propriété d'un objet.

3voto

· Attribuer est pour des valeurs primitives comme BOOL, NSInteger ou double. Pour les objets utilisation de conserver ou de copie, selon si vous souhaitez conserver une référence à l'objet d'origine ou en faire une copie. · attribuer: Dans votre méthode de définition de la propriété, il ya un moyen simple de la cession de votre variable d'instance à la nouvelle valeur, par exemple:

-(void)setString:(NSString*)newString{
 string = newString; 
}

Cela peut causer des problèmes depuis Objective-C d'objets utilisation de comptage de référence, et donc par le fait de ne pas conserver l'objet, il y a une chance que la chaîne pourrait être libéré pendant que vous êtes encore à l'utiliser. · retenir: il conserve la nouvelle valeur dans votre méthode d'initialisation. Par exemple: C'est plus sûr, puisque vous déclarez explicitement que vous souhaitez conserver une référence de l'objet, et vous devez le libérer avant qu'il ne soit libéré.

(void)setString:(NSString*)newString{
     
        [newString retain];
     
          [string release];
       
 string = newString;
    
}

· copie: ce qui rend une copie de la chaîne dans votre méthode de définition: Ceci est souvent utilisé avec des chaînes, depuis la création d'une copie de l'objet original, assure qu'elle n'est pas modifiée lors de l'utilisation.

(void)setString:(NSString*)newString{
       
         if(string!=newString){
         
                        [string release];
         
                        string = [newString copy];
       
         }

    }

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X