+ – qual è il punto?

Poiché le stringhe NSString sono immutabili, qual è il valore del metodo stringWithString: class?

Ottengo l’utilità quando viene utilizzato con NSMutableString , semplicemente non ho visto l’utilità con la class NSString .

Potresti avere una NSMutableString (o una sottoclass NSString sviluppata in proprio) che desideri duplicare.

 NSMutableString *buffer = [NSMutableString string]; // do something with buffer NSString *immutableStringToKeepAround = [NSString stringWithString:buffer]; 

Certo, puoi anche solo fare una copia:

 NSMutableString *buffer = [NSMutableString string]; // do something with buffer NSString *immutableStringToKeepAround = [[buffer copy] autorelease]; 

ma tu possiedi la copia e devi rilasciarla o autorizzarla automaticamente.

Come sottolinea “Andy” nel n. 318666, è relativo alla gestione della memoria, citando:

La differenza tra initWithString e stringWithString è che stringWithString restituisce un puntatore rilasciato automaticamente. Ciò significa che non è necessario rilasciarlo in modo specifico, dato che la prossima volta si occuperà del fatto che il pool di auto-rilascio pulisce tutti i puntatori auto-rilasciati.

initWithString, d’altra parte, restituisce un puntatore con un conteggio dei ritardi pari a 1: è necessario chiamare il rilascio su quel puntatore, altrimenti risulterebbe una perdita di memoria.

(Preso da qui )

Restituisce una stringa creata copiando i caratteri da un’altra stringa specifica

 [NSString stringWithString:@"some string"] 

È equivalente a

 [[[NSString alloc] initWithString:@"some string"] autorelease] 

Inoltre, se si ha un puntatore a una NSString, potrebbe effettivamente essere una sottoclass di NSString come NSMutableString. Quindi, se si desidera memorizzare la stringa e garantire che non cambi, è necessario crearne una copia, quindi esiste stringWithString.

Come altro caso d’uso, se (per qualsiasi motivo) si crea la propria sottoclass di NSString o NSMutableString, stringWithString: fornisce un modo pratico per istanziarlo con un’istanza di NSString, NSMutableString o MyCustomString.

Io uso spesso +stringWithString: quando ho bisogno di creare un NSMutableString ma avviarlo con un valore iniziale. Per esempio:

 NSMutableString * output = [NSMutableString stringWithString:@"
    "]; for (NSString * item in anArray) { [output appendFormat:@"
  • %@
  • ", item]; } [output appendString:@"
"];

A proposito, ora che stiamo compilando con ARC abilitato, non è necessario rilasciare affatto manualmente, ARC inserirà le chiamate di rilascio durante la compilazione. Quindi, come è ancora diverso? stringWithString viene comunque aggiunto al pool autorelease che viene svuotato in futuro (a meno che non sia stato creato il proprio pool di autorelease). initWithString avrà una chiamata di rilascio appena prima della fine della funzione, quindi se non lo hai mantenuto da qualche parte nel metodo, puoi essere sicuro che la stringa viene distrutta alla fine della chiamata di funzione. Questo ti dà un controllo più stretto sulla gestione della memoria rispetto all’uso di oggetti autoreleased.