2010-03-26 29 views
6
NSString *myString = @"sample string"; 
    NSString *newString = [myString copy]; 

Se si imposta un punto di interruzione dopo queste due righe, il puntatore per myString è uguale al puntatore per newString.Copia NSString non copia?

WTF? La copia NSString non dovrebbe restituire un puntatore a un nuovo oggetto? O mi manca qualcosa di fondamentale su come dovrebbe funzionare la copia?

+0

Non so la risposta, ma se si cambia myString poi entrambi hanno indirizzo diverso ... fino a che il contenuto della stringa è lo stesso è nella stessa indirizzo ... –

+2

Per prima cosa, in effetti non si chiamava copia, si chiamava stringWithString :. In secondo luogo, poiché le stringhe sono immutabili, il compilatore e il runtime apportano ottimizzazioni. Gli oggetti solitamente immutabili verranno restituiti con un numero di riferimento aggiuntivo anziché creare un nuovo oggetto effettivo. –

+0

Bellezza del cacao - non fare copie di dati quando non richiesto ... – stefanB

risposta

9

Poiché NSString è non modificabile potrebbe aumentare solo internamente ref count ed essere fatto con esso.

Quando si release uno di questi NSStrings potrebbe diminuire solo ref count - gestione della memoria standard.

Vedi qualche problema?

6

Pensa a questo: NSMutableString è una sottoclasse di NSString. Quando la tua proprietà è dichiarata come NSString, non ti aspetti che cambi.

Considerare, se si è utilizzato retain e qualcuno ti ha dato un NSMutableString e in seguito lo ha modificato, la classe verrà interrotta.

Tuttavia, si può pensare che sempre copy sia lento. Quindi NSString 'chiama semplicemente retain. NSMutableString 's copy fa una copia reale.

Di solito è meglio dare uno sputo a NSString * perché le persone non dovranno copiarlo tutto il tempo.

1

È meglio fare una copia del valore di stringa restituito da un metodo, poiché il valore restituito potrebbe essere un oggetto stringa mutabile e questo valore può essere modificato in altro thread dopo essere stato restituito da tale metodo.

1

è possibile allocare nuova variabile come nel campione

NSString *anotherString = [[NSString alloc] initWithString:originalString]; 
Problemi correlati