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.
fonte
2009-11-26 21:17:11
+1 per spiegare effettivamente e non solo rispondere ... –
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? –
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à. –