2009-10-23 22 views

Respuesta

20

Puede tener un NSMutableString (o alguna subclase NSString local) que desee duplicar.

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

Por supuesto, también puede simplemente hacer una copia:

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

pero propietario de la copia y debe liberar o AutoRelease ella.

+12

Una distinción menor es que [[copia nil] autorelease] devolverá nil, pero [NSString stringWithString: nil] arrojará una excepción. –

+0

Genial, ¡no lo sabía! Información práctica. –

9

Como señala "Andy" en el # 318666, que está relacionado con la gestión de memoria, citando:

La diferencia entre initWithString y stringWithString es que stringWithString devuelve un puntero de auto-editado. Esto significa que no es necesario que lo libere específicamente, ya que se tendrá en cuenta la próxima vez que el grupo de liberación automática limpie cualquier puntero lanzado automáticamente.

initWithString, por otro lado, devuelve un puntero con un conteo retenido de 1; no necesita llamar a la liberación de ese puntero, de lo contrario se produciría una pérdida de memoria.

(Tomado de here)

1

Devuelve una cadena creada copiando los caracteres de otra cadena dada

[NSString stringWithString:@"some string"] 

es equivalente a

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

[¿Por qué no simplemente '' "algo de cadena" 'though?] (Http: // stackoverflow.com/questions/6280849/nsstring-stringwithstringsome-string-vs-some-string) – ma11hew28

1

Además, si usted tiene un puntero a un NSString, en realidad puede ser una subclase de NSString como NSMutableString. Por lo tanto, si desea almacenar la cadena y tener la garantía de que no cambia, debe hacer una copia, por lo tanto, existe stringWithString.

+2

No estoy seguro de que esto sea completamente válido, ya que, como usted señala, NSMutableString es una subclase de NSString, en realidad puede tener algo como 'cadena NSS * = @ "str"; NSMutableString * mStr = [NSMutableString stringWithString: string]; 'y recupera una cadena mutable. – Tim

+0

@Tim: sí, eso es válido. – newacct

+0

Quise decir si tienes un método como - (void) setName: (NSString *) name; en realidad no sabe si el nombre es un NSString o una subclase. Por lo tanto, es posible que desee hacer una copia, por lo que su valor no cambia a sus espaldas. –

1

Como otro caso de uso, si (por cualquier razón) a crear su propia subclase de NSString o NSMutableString, stringWithString: proporciona una forma práctica de crear una instancia con una instancia de cualquiera de NSString, NSMutableString o MyCustomString.

0

A menudo uso +stringWithString: cuando necesito crear un NSMutableString pero lo comienzo con un valor inicial. Por ejemplo:

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

FYI, ahora que estamos recopilando con ARC está activado, no tiene que liberar manualmente en absoluto, ARC se inserte el comunicado de llama durante el tiempo de compilación. Entonces, ¿cómo es todavía diferente? stringWithString aún se agrega al grupo de liberación automática, que se agota en el futuro (a menos que haya creado su propio grupo de autorrelease). initWithString tendrá una llamada de liberación justo antes de que termine la función, por lo que si no la retuvo en algún lugar del método, puede estar seguro de que la cadena se destruirá al final de la llamada a la función. Esto le da un control más estricto sobre la administración de memoria en lugar de usar objetos liberados automáticamente.