Domanda

Il codice seguente viene compilato ed eseguito, MA secondo tutti i libri di sviluppo di iPhone e la documentazione di Apple non dovrebbe! Qualcuno può spiegarmi come mai NSString immutabile consente di modificare i suoi valori dopo che è stato impostato? Pensavo di dover usare NSMuttableString per cambiare il contesto della stessa variabile stringa? Sto usando SDK 3.1.

NSString *test =[[NSString alloc] initWithString:@"TEST"];
[test release];
test = @"TEST2";
È stato utile?

Soluzione

Forse l'esempio seguente aggiungerà le risposte di Mark e Niels e aiuterà a chiarire le cose.

Stringhe immutabili

// 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);

Stringhe mutabili

// 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);

Nota quando usi l'immutabile classe NSString che l'unico modo per " sostituire " una stringa è quella di creare una nuova stringa e aggiornare la tua variabile " str2 " per indicarlo. Ciò tuttavia non influisce su ciò che " str1 " punta a, quindi farà comunque riferimento alla stringa originale.

Nell'esempio di NSMutableString, non creiamo una seconda stringa, ma alteriamo (mutiamo) il contenuto dell'esistente "Ciao mondo" stringa. Poiché entrambe le variabili continuano a puntare allo stesso oggetto stringa, entrambe riporteranno il nuovo valore nella chiamata a NSLog.

È importante distinguere tra una variabile puntatore e l'oggetto reale a cui punta. Un oggetto NSString è immutabile, ma ciò non impedisce di modificare il valore di una variabile che punta a una stringa.

Il tipo di dati " NSString * " è un puntatore a un oggetto NSString, non l'oggetto stesso. Se si imposta un punto di interruzione in una delle istruzioni NSLog all'interno del debugger XCode, è possibile verificare il valore non elaborato di ciascuna variabile per chiarirlo.

Altri suggerimenti

Non stai mutando la stringa, stai semplicemente riassegnando il test variabile per puntare a una stringa diversa. La stringa originale non è stata modificata.

TEST e TEST2 sono due stringhe diverse indicate dal puntatore * test.

Non stai modificando il contenuto dell'oggetto NSString esplicitamente allocato dalla prima riga di codice ma stai indicando * test su un altro oggetto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top