web-dev-qa-db-fra.com

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?
79
Sabha B

Réponse mise à jour pour la documentation modifiée

Les informations sont maintenant réparties dans plusieurs guides de la documentation. Voici une liste de lectures obligatoires:

La réponse à cette question dépend désormais entièrement de savoir si vous utilisez une application gérée par ARC (la valeur par défaut moderne pour les nouveaux projets) ou si vous forcez la gestion manuelle de la mémoire.

Assign vs. Weak - Utilisez assignez pour définir le pointeur d'une propriété sur le adresse de l'objet sans le conserver ou le curer d'une autre manière; utilisez faible pour que la propriété pointe automatiquement sur nil si l'objet qui lui est affecté est désalloué. Dans la plupart des cas, vous voudrez utiliser faible pour ne pas accéder à un objet désalloué (accès illégal d'une adresse mémoire - "EXC_BAD_ACCESS ") Si vous n'effectuez pas un nettoyage approprié.

Conserver ou copier - Les propriétés déclarées utilisent conservent par défaut peut simplement l'omettre complètement) et gérera automatiquement le nombre de références de l'objet, qu'un autre objet soit affecté à la propriété ou qu'il soit défini sur nil; Utilisez copy pour envoyer automatiquement à l'objet nouvellement affecté un message -copy (Qui créera une copie de l'objet transmis et affectera cette copie). à la propriété à la place - utile (même requis) dans certaines situations où l'objet assigné peut être modifié après avoir été défini en tant que propriété d'un autre objet (ce qui signifierait que la modification/mutation s'appliquerait également à la propriété).

119
Joshua Nozzi

Le Guide de programmation de la gestion de la mémoire de la bibliothèque de référence iOS contient les bases de l'affectation, de la copie et de la conservation, avec des analogies et des exemples.

copy Crée une copie d'un objet et le renvoie avec un nombre de conservations égal à 1. Si vous copiez un objet, vous êtes propriétaire de la copie. Ceci s'applique à toute méthode contenant la copie Word où "copie" fait référence à l'objet renvoyé.

Retenir Augmente le nombre de retenues d'un objet de 1. Acquiert la propriété d'un objet.

release Réduit le nombre de retenues d'un objet de 1. Renonce à la propriété d'un objet.

32
Larry Hipp
NSMutableArray *array = [[NSMutableArray alloc] initWithObjects:@"First",@"Second", nil];
NSMutableArray *copiedArray = [array mutableCopy];
NSMutableArray *retainedArray = [array retain];

[retainedArray addObject:@"Retained Third"];
[copiedArray addObject:@"Copied Third"];

NSLog(@"array = %@",array);
NSLog(@"Retained Array = %@",retainedArray);
NSLog(@"Copied Array = %@",copiedArray);

array = (
    First,
    Second,
    "Retained Third"
)
Retained Array = (
    First,
    Second,
    "Retained Third"
)
Copied Array = (
    First,
    Second,
    "Copied Third"
)
8
srivas
  1. attribuer

    • assign est un attribut de propriété par défaut
    • assign est un attribut de propriété indique au compilateur comment synthétiser l'implémentation de la propriété
  2. copie:

    • une copie est requise lorsque l'objet est mutable
    • copy renvoie un objet que vous devez libérer explicitement (par exemple, dans dealloc) dans des environnements non traités
    • vous devez libérer l'objet lorsque vous avez terminé, car vous conservez la copie
  3. conserver:

    • spécifie que la nouvelle valeur doit être envoyée "-retain" lors de l'affectation et l'ancienne valeur envoyée "-release"
    • si vous écrivez conserver, il fonctionnera automatiquement comme fort
    • Des méthodes comme "alloc" incluent une "retenue" implicite
4
Chen Rui