10
votes

Nstring Copy ne copie pas?

  NSString *myString = @"sample string";
  NSString *newString = [myString copy];
If I set a breakpoint after these two lines, the pointer for myString is the same as the pointer for newString.WTF?  Isn't NSString copy supposed to return a pointer to a new object?  Or am I missing something fundamental about how copy is supposed to work?

5 commentaires

Je ne connais pas la réponse, mais si vous changez de mystring, j'ai une adresse différente ... jusqu'à ce que le contenu de la chaîne soit identique, il est identique à la même adresse ...


Premièrement, vous n'avez pas réellement appelé Copie, vous avez appelé Stringwithstring :. Deuxièmement, les chaînes sont immuables, le compilateur et l'exécution font des optimisations. Habituellement, des objets immuables seront renvoyés avec un nombre de référence supplémentaire plutôt que de créer un nouvel objet réel.


Beauté du cacao - Ne pas faire des copies de données lorsqu'il n'est pas nécessaire ...


Oups, désolé, cela aurait dû être une copie (testé quelques versions différentes et collé le mauvais). Néanmoins, le comportement est le même.


@Jasoncoco mais c'est une "optimisation" du cadre, car nstring est une classe "ordinaire", pas un type intégré.


4 Réponses :


10
votes

Etant donné que nstring est non mutable , il pourrait tout simplement augmenter en interne Ref Compte et être fait avec elle.

Lorsque vous Libération L'une de ces nstrings Il pourrait simplement décrire Ref Compte - Gestion de la mémoire standard.

Voyez-vous des problèmes avec cela?


0 commentaires

8
votes

pense à cela: nsmutableString est une sous-classe de nstring . Lorsque votre propriété est déclarée comme Nstring , vous ne vous attendez pas à ce qu'elle change.

Considérez si vous avez utilisé Conserver et que quelqu'un vous a donné un nsmutableString , puis ultérieurement le modifie, votre classe sera cassée.

Cependant, vous pouvez penser que toujours copier est lent. Donc nstring 's copie appelle simplement conserver . nsmutableString s copie fait une copie réelle.

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


0 commentaires

1
votes

C'est une meilleure pratique de copier la valeur de chaîne renvoyée par une méthode, puisque la valeur renvoyée peut-être un objet de chaîne mutable, et cette valeur peut être modifiée dans un autre thread après son retour par cette méthode.


0 commentaires

2
votes

Vous pouvez affecter une nouvelle variable comme dans l'échantillon

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


0 commentaires