Le mot de la fin sur NSStrings: Changeant et Immuable
J'ai lu dans plusieurs livres... et en ligne... sur le immuable et changeante des chaînes.
Ils prétendent "immuable chaînes" ne peut pas être changé.
(Mais ils n'ont jamais définir le "changement".)
Laquelle de ces NSStrings peut être modifié sans l'aide de NSMutableString?
La chaîne contient "poisson-chat"... et plus tard, j'ai essayer de le changer pour "chat".
(Mêmes lettres, juste plus court.)
Il contient "chat"... et j'ai essayer de le changer pour "poisson-chat".
(Départ similaire... mais fait juste plus de temps.)
- Je changer de "chat" en "CHAT".
(Mêmes lettres, mais seulement l'affaire a changé.)
- Je changer de "chat" en "chien".
(Totalement différent de la chaîne, mais de la même longueur.)
- Je changer de "chat" en "cornouiller".
(Totalement différent de la chaîne, mais plus de temps.)
OriginalL'auteur Donna | 2009-05-25
Vous devez vous connecter pour publier un commentaire.
La réponse est aucun. Immuable signifie qu'il ne peut pas être modifié dans rien différents que la chaîne d'origine. Chaque personnage reste le même, la longueur ne peut pas changer, etc. Une fois qu'il est défini vous ne pouvez pas changer quoi que ce soit à propos de cette chaîne. Si vous voulez faire plus long ou plus court ou en changer les caractères, vous devez faire une nouvelle chaîne de caractères (ou utiliser un NSMutableString pour commencer).
Imaginez si int/float/long ont également été immutables. int x = 5; et alors x JAMAIS être changé. Immuable est (presque) inutile. Non?
"faire quelque chose" pourrait simplement signifier la lecture de certains magasin de données et de les afficher. Dans ce cas, vous ne voulez pas de les modifier.
Vous confondez l'immutabilité d'un objet avec la possibilité d'affecter à une variable qui pointe vers un objet. Un objet est immuable si elle n'a pas de méthodes qui permettent de son état d'être changé. Si vous définissez une variable pour pointer vers un objet immuable, vous pouvez toujours définir la variable à point à tout autre objet à tout moment. L'objet immuable signifie que vous savez qu'une fois que vous pointez sur un objet, son état ne vais pas changer quelque chose (par exemple par quelqu'un d'autre qui a aussi une variable qui pointe vers le même objet). P. S. NSNumber objets sont aussi immuables, mais ne sont pas inutiles.
Pour développer sur newacct du commentaire, il est TRÈS important de faire la distinction entre les variables et les objets en Objective-C. n'Importe quel nombre de variables peut pointent toutes vers le même objet. Toutes ces variables peuvent ensuite être affectés à un nouvel objet sans affecter les autres. D'autre part, si l'objet lui-même est muté, à chaque endroit dans le code avec une variable pointant sur l'objet peut voir les modifications apportées à l'objet. Avoir une modification de l'objet de sous vous comme c'est souvent indésirable.
OriginalL'auteur Marc Novakowski
Si je déclare une variable:
Ce qui est immuable est l'objet pointé par
var
, pasvar
lui-même.Cela signifie que je ne peux pas changer quoi que ce soit de l'objet pointé par
var
, mais je peux changer l'objet pointé.Aucune des activités que vous mentionnez est autorisé sur
var
, mais vous pouvez affectervar
avec une autre chaîne de caractère:Merci, j'ai mis à jour le format. À propos de la fuite de mémoire, il dépend de la façon dont la première valeur de la var a été créé.
OriginalL'auteur mouviciel
NSString ne peut pas être modifié, à chaque fois que vous affectez une chaîne de valeur à l'objet NSString il sera orphelin de l'ancien objet de type string et re-créer le nouvel objet de type string. C'est une opération coûteuse si vous êtes aux prises avec de grandes tampon de chaîne. Si vous êtes aux prises avec chaîne de taille de la mémoire tampon, puis utiliser NSMutableString pour des performances optimales. Ceci est similaire à la chaîne de vs stringBuilder .net.
OriginalL'auteur user1128033
Vous devez définir le "changement", trop 🙂
Fondamentalement, lorsque vous créez un NSString, vous êtes en train de créer un tableau de caractères et vous avez dit au compilateur que le contenu de dit tableau ne changera jamais. Le "plus jamais de changement de la partie" est "immuable" de la partie; les données de la chaîne de caractères contient peut pas être modifié.
D'autre part, une NSMutableString vous permet de modifier les données des points d' (c'est 'mutable'). Notez que le 'appendString" méthode qui existe pour NSMutableString; cela prend de données et des gifles sur la fin de la chaîne.
Par exemple, si vous avez eu:
NSString *machaine = @"Chat";
myString = @"Goldfish";
Qui fonctionne très bien. Vous n'êtes jamais réellement changer les données myString contient; vous êtes simplement en disant ce que vous voulez qu'elle point à un nouveau segment de immuable de données.
La seule fois que vous aviez réellement des problèmes avec les différences entre mutable et des objets immuables est si vous avez essayé de réellement modifier myString directement (par exemple, ajouter un "s sont cool" ou quelque chose).
En d'autres termes, la classe devrait vous permettre de "changer" une chaîne dans une autre chaîne, mais les méthodes utilisées pour faire il serait très différente. Par exemple, pour "tourner " chat" en "CHAT" avec une mutable chaîne, vous pouvez effectuer une itération sur chaque personnage et simplement le faire en majuscules (puisque vous pouvez modifier le contenu d'une mutable chaîne). Avec une immuable de la chaîne, d'autre part, vous devez d'abord copier la chaîne d'origine d'ailleurs, le modifier, et ensuite rediriger votre variable au point de cette nouvelle NSString.
Les liens suivants peuvent être utiles:
http://www.kirupa.com/forum/showthread.php?t=307928
http://forums.macrumors.com/showthread.php?t=467099
Je recommande aussi de faire quelques recherches sur google; c'est une question qui concerne le développement en général, et c'est relativement concept important à comprendre. Il a aussi été discuté à la mort d'ailleurs sur l'internet.
Si vous êtes à l'aide de la programmation simultanée (plusieurs threads, etc.) c'est très agréable de savoir que le contenu de votre chaîne ne changera pas dans le milieu de votre utilisation. Si vous avez eu à vous soucier de cela, vous auriez probablement faire une copie de la chaîne avant de faire quelque chose d'autre pour que personne ne le changera. L'immutabilité fait en sorte que vous n'avez pas à copier la chaîne. Cela devient encore plus important pour les plus grandes structures comme NSArray et NSDictionary. Si vous avez seulement un thread (si vous ne savez pas ce que cela signifie, vous avez seulement un), puis à l'aide des mutables partout serait probablement très bien.
Même si vous n'utilisez pas plus d'un thread, il est bon de savoir si un objet peut changer de sous vous. En général, je trouve qu'il est plus simple d'utiliser l'immuable structures de données la plupart du temps. Si je crée un NSArray, le donner à quelqu'un d'autre et puis continuer à l'utiliser, il est utile de savoir si quelqu'un peut avoir changé derrière mon dos. En bref, à l'aide mutable partout, c'est plus facile à écrire, mais beaucoup plus difficile à déboguer.
Pourquoi aurais-je écrire le code là où d'autres parties de mon code est en train de changer mes variables à mon insu? N'est-ce pas tout simplement la Mauvaise Programmation?
OriginalL'auteur user43922
Immuable de la chaîne (ou, d'ailleurs, aucune immuable de l'objet) est celui qui ne peut pas être changé après l'initialisation.
Voici l'avantage de l'utilisation de cordes immuables, en (pseudo-)pseudo-code:
Maintenant quoi? "Bonjour Le Monde"? "Adieu Monde"?
Maintenant, ce n'b?
Si les chaînes sont mutables, alors il pourrait tenir "au Revoir Monde". C'est peut être ce que vous voulez. Peut-être pas.
Avec l'immutabilité, il devient très clair que b pointe toujours à la chaîne d'origine, parce que le remplacement de la méthode ne peut pas avoir changé la chaîne réelle, mais plutôt retourné une référence à une nouvelle chaîne.
Vous risquez de ne pas voir beaucoup d'avantages dans cet exemple. Mais si a et b sont référencés et utilisés dans les différentes parties du code, ou dans des threads différents, ayant immuable références supprime beaucoup d'erreurs potentielles.
OriginalL'auteur Steve McLeod
Par défaut, NSString utilisé dans le langage objective C est immuable. NSMutableString est utilisé pour déclarer & définir une mutable chaîne. Rien dans immuable chaîne peut être modifiée. Pas la longueur, et non pas les personnages, rien.
OriginalL'auteur