2009-11-26 8 views
5

Il codice seguente compila ed esegue, MA secondo tutti i libri di sviluppo iPhone e la documentazione Apple non dovrebbe! Qualcuno può spiegarmi come mai immutabile NSString permette di cambiare 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 immutable permette di cambiare i suoi valori?

NSString *test =[[NSString alloc] initWithString:@"TEST"]; 
[test release]; 
test = @"TEST2"; 

risposta

20

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 Mutevole

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

Avviso quando si utilizza la classe NSString immutabile che l'unico modo per "sostituire" una stringa è quello di creare una nuova stringa e aggiornare la variabile "str2" per indicarlo. Questo tuttavia non influisce su cosa "str1" sta puntando, quindi farà comunque riferimento alla stringa originale.

Nell'esempio NSMutableString, non viene creata una seconda stringa, ma viene invece alterato (mutato) il contenuto della stringa "Hello World" esistente. Poiché entrambe le variabili continuano a puntare allo stesso oggetto stringa, entrambi segnaleranno 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 all'oggetto stesso. Se si imposta un punto di interruzione su una delle istruzioni NSLog all'interno del debugger XCode, è possibile controllare il valore non elaborato di ciascuna variabile per chiarirlo.

+1

+1 per spiegare effettivamente e non solo rispondere ... –

+1

Grazie Christopher, ma per esempio esempio come questo: NSString * str = @ "one"; str = [str StringByAppendingString: @ "two"] Stai dicendo che anche se utilizzo la stessa variabile, creo due oggetti diversi? Inoltre, cosa succede a questi oggetti NSString che creiamo esplicitamente, vengono ripuliti dall'autelease? –

+1

Sì, ciò creerà due oggetti stringa immutabili. "Uno" e "onetwo". Uno dei vantaggi di s mutabile Trings è che possono aiutare ad evitare ulteriori oggetti stringa temporanei se si eseguono operazioni di tipo accodamento di stringhe di lotti come nell'esempio che hai fornito. Ciò può garantire guadagni di efficienza nell'uso della memoria e della velocità. –

7

Non si sta mutando la stringa, si sta solo riassegnando il test delle variabili in modo che puntino a una stringa diversa. La stringa originale non è stata modificata.

+0

Ok, ha senso. Quindi cosa intendono dire mutando le stringhe in obj C? E perché in ogni libro si dice di creare una nuova stringa quando si assegnano nuovi valori a NSString? Grazie! –

+2

Significa cambiare i singoli caratteri di una stringa, ad esempio cambiando "Ciao, mondo!" In "Yello, mondo!", Cambiando il primo carattere in "Y" e lasciando il resto invariato. Questo tipo di operazione è possibile solo se le stringhe sono mutabili, come in C, ad esempio –

7

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

Non si modifica il contenuto dell'oggetto NSString assegnato in modo esplicito dalla prima riga di codice ma si punta * test su un altro oggetto.

Problemi correlati