2009-10-23 3 views

risposta

20

Si potrebbe avere una NSMutableString (o una sottoclasse NSString sviluppata in proprio) che si desidera duplicare.

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

Naturalmente, si può anche solo fare una copia:

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

ma è proprio la copia e devono liberare o autorelease esso.

+12

Una piccola distinzione è che [[nil copy] autorelease] restituirà nil, ma [NSString stringWithString: nil] genererà un'eccezione. –

+0

Cool, non lo sapevo! Informazioni utili –

9

come "Andy", sottolinea a # 318666, è legato alla gestione della memoria, citando:

La differenza tra initWithString e stringWithString è che stringWithString restituisce un puntatore auto-rilasciato. 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 di ritenzione pari a 1 - è necessario chiamare il rilascio su quel puntatore, altrimenti risulterebbe una perdita di memoria.

(Tratto da here)

1

Restituisce una stringa creata copiando i personaggi da un altro dato stringa

[NSString stringWithString:@"some string"] 

è equivalente a

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

[Perché non basta fare '@" una stringa "' tuttavia?] (Http: // stackoverflow.com/domande/6280849/NSString-stringwithstringsome-string-vs-some-string) – ma11hew28

1

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

+2

Non è sicuro questo è abbastanza valida - in quanto, come fai notare, NSMutableString è una sottoclasse di NSString, si può effettivamente avere qualcosa di simile a 'NSString * string = @ "str"; NSMutableString * mStr = [NSMutableString stringWithString: string]; 'e restituisce una stringa mutabile. – Tim

+0

@Tim: sì, è valido. – newacct

+0

Intendevo se avete un metodo come - (void) setName: (NSString *) name; in realtà non sai se il nome è una NSString o una sottoclasse. Quindi, potresti volerne fare una copia, quindi il valore non cambia alle tue spalle. –

1

Come un altro caso d'uso, se (per qualsiasi motivo) si crea il proprio sottoclasse di NSString o NSMutableString, stringWithString: fornisce un modo pratico per creare un'istanza di esso con un'istanza di una NSString, NSMutableString o MyCustomString.

0

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

NSMutableString * output = [NSMutableString stringWithString:@"<ul>"]; 
for (NSString * item in anArray) { 
    [output appendFormat:@"<li>%@</li>", item]; 
} 
[output appendString:@"</ul>"]; 
0

Cordiali saluti, ora che siamo la compilazione con ARC abilitato, non c'è bisogno di rilasciare manualmente a tutti, ARC sarà inserire il rilascio chiama durante la fase di 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.