Quelle est la différence entre copy
et retain
pour NSString
?Quelle est la différence entre "copier" et "conserver"?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
Quelle est la différence entre copy
et retain
pour NSString
?Quelle est la différence entre "copier" et "conserver"?
- (void)setString:(NSString*)newString
{
string = [newString copy];
}
Dans un paramètre général, la conservation d'un objet augmentera son nombre de retenues de un. Cela aidera à garder l'objet en mémoire et à l'empêcher d'être emporté. Qu'est-ce que cela signifie est que si vous ne détenez qu'une version retenue, vous partager cette copie avec qui vous l'avez passé.
La copie d'un objet, quelle que soit la manière dont vous le faites, doit créer un autre objet avec en double. Pensez à cela comme un clone. Vous ne partagez PAS le clone avec qui vous l'avez transmis.
Lorsque vous traitez avec NSString
en particulier, vous ne pouvez pas être en mesure de supposer que celui qui vous donne un NSString
vous donne vraiment un NSString
. Quelqu'un pourrait vous donner 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, vous pouvez avoir des problèmes.
Retenue et la copie sont deux choses différentes, le premier est appel par référence sur le plan conceptuel tandis que le second est appel par valeur.
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 ne l'implémente pas, vous devez donc être prudent avec le type sur lequel vous allez opérer (ou vérifier la prise en charge de ce protocole) lorsque vous essayez d'appeler copy
.
La meilleure règle à utiliser copy
Je peux penser à, est de toujours définir les propriétés de NSString à "copier" au lieu de conserver. De cette façon, vous obtenez des lectures plus précises de l'instrument Leaks si vous vous trompez et oubliez de relâcher une chaîne sur laquelle un objet se tient. Les autres utilisations de la copie doivent être plus réfléchies.
copie: crée une nouvelle instance qui est une copie du destinataire. Cela signifie que vous aurez 2 différents
conserver: Augmente le retainCount
du récepteur. Un objet est supprimé de la mémoire - (avec dealloc), lorsque retainCount est 0.
Je pense que vous voulez dire "désengagé" (un peu gênant pour verbaliser ce mot), pas "impasse" – Brian
si vous utilisez retain, il copie la valeur du pointeur de l'original one.retain incrémente également le nombre de références de un. mais en cas de copie, il duplique les données référencées par le pointeur et l'affecte à la variable d'instance de copie.
Conserver: Cela se fait sur l'objet créé, et cela augmente simplement le nombre de références.
copie - Il crée un nouvel objet et quand nouvel objet est créé conserver le nombre sera 1.
Hope Cet aide pour U ... :)
conserver l'attribut est spécifié de telle sorte que il peut retenir l'autre mémoire i.e il peut être fait pour pointer vers une autre adresse également copie Copie d'abord l'adresse puis la conserve.
Son un ancien poste, mais voici mon avis sur la question
Retain augmente le nombre de conserver d'un objet par 1 et prend possession d'un objet. Alors qu'une copie copiera les données présentes dans l'emplacement de la mémoire et l'assignera à la variable, dans le cas d'une copie, vous copiez d'abord les données à partir d'un emplacement et l'attribuez à la variable qui augmente le nombre de retenues.
Rappelez-vous simplement qui conservent des œuvres sur la référence et la copie des œuvres sur la valeur
Retain ne copie pas la référence. –
Le 'copier' crée-t-il un nouvel objet ?? , – Dhiru
Il convient de mentionner que 'copy' équivaut à' retain' pour la plupart des classes 'Foundation' qui ne sont pas mutable. – rpetrich
Très instructif .. – Krishnan
Puis-je suggérer que "vous ** partagez ** cette * instance * avec qui vous l'avez transmise" est plus claire que "vous ** partagez ** cette * copie * avec qui vous l'avez transmise" ? (Voyant que nous parlons déjà de copier) –