2010-03-26 7 views
6
NSString *myString = @"sample string"; 
    NSString *newString = [myString copy]; 

Si je définis un point d'arrêt après ces deux lignes, le pointeur de myString est le même que le pointeur de newString.La copie NSString ne copie pas?

WTF? Est-ce que la copie NSString n'est pas supposée renvoyer un pointeur vers un nouvel objet? Ou est-ce que je manque quelque chose de fondamental sur la façon dont la copie est supposée fonctionner?

+0

je ne sais pas la réponse, mais si vous changez maChaine alors à la fois avoir l'adresse différente ... jusqu'à ce que le contenu de la chaîne est le même, il est dans le même adresse ... –

+2

Tout d'abord, vous n'avez pas réellement appelé copy, vous avez appelé stringWithString :. Deuxièmement, puisque les chaînes sont immuables, le compilateur et l'exécution font des optimisations. Les objets habituellement immuables seront retournés avec un nombre de références additionnel plutôt que de créer un nouvel objet réel. –

+0

La beauté du cacao - ne pas faire des copies de données quand ce n'est pas nécessaire ... – stefanB

Répondre

9

Depuis NSString est pas mutable il pourrait simplement augmenter en interne ref count et être fait avec elle.

Lorsque vous release l'un de ces NSStrings, il peut simplement décrémenter ref count - gestion de la mémoire standard.

Voyez-vous des problèmes avec cela?

6

Réfléchissez à ceci: NSMutableString est une sous-classe de NSString. Lorsque votre propriété est déclarée NSString, vous ne vous attendez pas à ce qu'elle change. Considérons, si vous avez utilisé retain et que quelqu'un vous a donné un NSMutableString et que plus tard le change, votre classe sera brisée.

Cependant, vous pouvez penser que toujours copy ing est lent. Donc NSStringcopy appelle simplement retain. NSMutableStringcopy fait une copie réelle.

Il est généralement préférable de donner cracher un NSString * parce que les gens n'auront pas à copier tout le temps.

1

Il est une meilleure pratique de faire copier la valeur de chaîne retournée par une méthode, puisque la valeur retournée peut-être un objet chaîne mutable, et cette valeur peut être modifiée dans un autre fil après retourné par cette méthode.

1

Vous pouvez Allouer comme nouvelle variable dans l'échantillon

NSString *anotherString = [[NSString alloc] initWithString:originalString];