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?
4 Réponses :
Etant donné que Lorsque vous Voyez-vous des problèmes avec cela? P> nstring code> est non mutable strud>, il pourrait tout simplement augmenter en interne
Ref Compte code> et être fait avec elle. P>
Libération CODE> L'une de ces nstrings Il pourrait simplement décrire
Ref Compte code> - Gestion de la mémoire standard. P>
pense à cela: Considérez si vous avez utilisé Cependant, vous pouvez penser que toujours Il est généralement préférable de donner à la broche un nsmutableString code> est une sous-classe de
nstring code>. Lorsque votre propriété est déclarée comme
Nstring code>, vous ne vous attendez pas à ce qu'elle change. P>
Conserver code> et que quelqu'un vous a donné un
nsmutableString code>, puis ultérieurement le modifie, votre classe sera cassée. P>
copier code> est lent. Donc
nstring code> 's
copie code> appelle simplement
conserver code>.
nsmutableString code> s
copie code> fait une copie réelle. p>
nstring * code> parce que les gens n'auront pas à copier tout le temps. P>
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. P>
Vous pouvez affecter une nouvelle variable comme dans l'échantillon
NSString *anotherString = [[NSString alloc] initWithString:originalString];
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 code> est une classe "ordinaire", pas un type intégré.