Question

Le code ci-dessous est compilé et exécuté, MAIS selon tous les livres de développement pour iPhone et la documentation Apple, cela ne devrait pas! Quelqu'un peut-il m'expliquer s'il vous plaît comment immuable NSString permet-il de changer ses valeurs une fois qu'il a été défini? Je pensais que je devais utiliser NSMuttableString pour changer le contexte de la même variable de chaîne? J'utilise le SDK 3.1.

NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
Était-ce utile?

La solution

Peut-être que l'exemple suivant complétera les réponses de Mark et Niels et aidera à clarifier les choses.

Chaînes immuables

// Setup two variables to point to the same string
NSString * str1 = @"Hello World";
NSString * str2 = str1;

// "Replace" the second string
str2 = @"Hello ikilimnik";

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

Chaînes mutables

// Setup two variables to point to the same string
NSMutableString * str1 = [NSMutableString stringWithString:@"Hello World"];
NSMutableString * str2 = str1;

// "Replace" the second string
[str2 setString:@"Hello ikilimnik"];

// And list their current values
NSLog(@"str1 = %@, str2 = %@", str1, str2);

Lorsque vous utilisez la classe immuable NSString, notez que le seul moyen de " remplacer " une chaîne consiste à créer une nouvelle chaîne et à mettre à jour votre variable " str2 " pour le pointer. Cela n'affecte toutefois pas ce que "& str; str1" pointe vers, donc il fera toujours référence à la chaîne d'origine.

Dans l'exemple NSMutableString, nous ne créons pas une deuxième chaîne, mais modifions plutôt le contenu du "Hello World" existant. chaîne. Étant donné que les deux variables continuent de pointer vers le même objet chaîne, elles indiqueront toutes les deux la nouvelle valeur dans l'appel de NSLog.

Il est important de faire la distinction entre une variable de pointeur et l'objet réel pointé. Un objet NSString est immuable, mais cela ne vous empêche pas de changer la valeur d'une variable qui pointe vers une chaîne.

Le type de données "NSString *" est un pointeur sur un objet NSString, pas sur l'objet lui-même. Si vous définissez un point d'arrêt sur l'une des instructions NSLog dans le débogueur XCode, vous pouvez vérifier la valeur brute de chaque variable pour clarifier ce point.

Autres conseils

Vous ne modifiez pas la chaîne, vous réaffectez simplement la variable test pour qu'elle pointe vers une chaîne différente. La chaîne d'origine n'a pas été modifiée.

TEST et TEST2 sont deux chaînes différentes pointées par le pointeur * test.

Vous ne modifiez pas le contenu de l'objet NSString explicitement alloué à partir de la première ligne de code, mais vous pointez * test vers un autre objet.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top