web-dev-qa-db-fra.com

Quelle est la différence entre "copier" et "conserver"?

Quelle est la différence entre copy et retain pour NSString?

- (void)setString:(NSString*)newString
{
    string = [newString copy];
}
29

De manière générale, conserver un objet augmentera son nombre de retenues. Cela aidera à garder l’objet en mémoire et à l’empêcher de s’envoler. Cela signifie que si vous ne possédez que la version retenue , vous partagez cette copie avec celui qui vous l’a transmise.

La copie d'un objet, peu importe la procédure, doit créer un autre objet avec duplicate values. Pensez à cela comme à un clone. Vous ne partagez pas le clone avec qui que ce soit qui vous l'a transmis.

Lorsque vous traitez avec NSStrings en particulier, vous ne pouvez peut-être pas supposer que celui qui vous donne une NSString vous donne vraiment une NSString. Quelqu'un pourrait vous remettre une sous-classe (NSMutableString, dans ce cas), ce qui signifie qu'ils pourraient potentiellement modifier les valeurs sous les couvertures. Si votre application dépend de la valeur transmise et que quelqu'un la modifie sur vous, vous pouvez rencontrer des problèmes.

46
Malaxeur

Conserver et copier sont deux choses différentes, le premier Est conceptuellement appel par référence, tandis que le second est appel par valeur.

24
iTayb

Retenir : Cela est fait sur l'objet créé et il suffit d'augmenter le nombre de références.

copy - Il crée un nouvel objet et lorsqu’un nouvel objet est créé, le nombre de retenues est égal à 1.

J'espère que cette aide pour U ... :)

10
iPhone NewBIe

C'est un vieux post mais voici mon point de vue sur la question

Conserver augmente le nombre de retenues d'un objet de 1 et devient propriétaire d'un objet.

Attendre que copy copie les données présentes dans l'emplacement de mémoire et les affecte à la variable. Ainsi, dans le cas d'une copie, vous copiez d'abord les données d'un emplacement, affectez-les à la variable qui augmente le nombre de conservations.

Rappelez-vous simplement que conserver les travaux sur référence et les travaux de copie sur valeur

6
NSDumb

si vous utilisez l'option conserver, elle copie la valeur du pointeur à partir de one.retain incrémente également le nombre de références de 1. mais en cas de copie, il duplique les données référencées par le pointeur et les affecte à la variable d'instance de copie.

5
Kester

La plus grande différence est que si vous utilisez copy, l'objet que vous copiez doit implémenter le protocole NSCopying (très facile à faire). Tous les objets n'implémentent pas cela, vous devez donc vous assurer que vous savez exactement quel type vous allez utiliser (ou vérifier si ce protocole est supporté) lorsque vous essayez d'appeler copy.

La meilleure règle empirique pour utiliser copy auquel je peux penser est de toujours définir les propriétés de NSString sur "copier" au lieu de conserver. De cette façon, vous obtenez des lectures plus précises à partir de l'instrument Leaks si vous vous trompez et oubliez de libérer une chaîne sur laquelle un objet se tient. Les autres utilisations de la copie doivent être mieux pensées.

copie: crée une nouvelle instance qui est une copie du récepteur. Cela signifie que vous aurez 2 différents

conserver: Augmente la retainCount du récepteur. Un objet est supprimé de la mémoire - (avec dealloc), lorsque retentionCount vaut 0.

1
mxg

Conserver un objet signifie que le nombre de retenues augmente d’une unité. Cela signifie que l’instance de l’objet sera conservée en mémoire jusqu’à ce que le compte retenu retombe à zéro. La propriété stockera une référence à cette instance et partagera la même instance avec tous ceux qui l'ont conservée. Copier signifie que l'objet sera cloné avec des valeurs en double. Ce n'est partagé avec personne d'autre.

1
vikas bharat

l'attribut rétention est spécifié de sorte qu'il puisse conserver l'autre mémoire, c.-à-d. qu'il peut être fait pour pointer vers une autre adresse, ainsi que copie Copie d'abord l'adresse, puis la conserve. 

0
satisharyan