Pregunta

Viniendo de un fondo .NET, estoy acostumbrado a reutilizar variables de cadena para el almacenamiento, entonces, ¿es probable que el siguiente código cause una pérdida de memoria? El código está dirigido al iphone / itouch para que no haya GC automático.

-(NSString*) stringExample
{
    NSString *result = @"example";
    result = [result stringByAppendingString:@" test"]; // where does "example" go?

    return result;
}

Lo que me confunde es que las NSStrings son inmutables, pero puede reutilizar una variable 'inmutable' sin ningún problema.

¿Fue útil?

Solución

Definitivamente puede provocar pérdidas de memoria. Debe tener cuidado con la reutilización, ya que debe saber mucho sobre la implementación real del objeto NSString subyacente para decidir si está & "; Seguro &"; o no. Por lo tanto, si no está utilizando la recolección de basura, para estar seguro, no debe reutilizar las variables como lo ha hecho.

Por ejemplo, esto es totalmente seguro:

NSString *result = @"example";
result = [result stringByAppendingString:@" test"];

porque la cadena inicial era en realidad una constante de cadena objetiva-c. Sin embargo, esto provocaría una pérdida de memoria:

NSString *result = [[NSString alloc] initWithUTF8String:argv[0]];
result = [result stringByAppendingString:@" something more"];

Esto, sin embargo, sería seguro ya que nunca poseyó el resultado en primer lugar:

NSString *result = [NSString stringWithUTF8String:argv[0]];
result = [result stringByAppendingString:@" something more"];

Entonces, básicamente, si no posee el objeto o tiene activada la recolección de basura, es seguro. Sin embargo, si posee el objeto original y lo hace, perderá memoria.

Otros consejos

Interviniendo en la respuesta de Jason: Si no llama a retain, init, copy, mutableCopy o utiliza uno de los métodos initWithSomething, no es propio el objeto.

Entonces, en su código, @"example" es una constante de cadena almacenada en el código compilado, por lo que no hay nada que liberar. Y, dado que está devolviendo un stringWithString no es el propietario del objeto y puede suponer que se lanzará automáticamente en algún momento en el futuro.

" Definitivamente puede provocar pérdidas de memoria. Debe tener cuidado con la reutilización, ya que debe saber mucho sobre la implementación real del objeto NSString subyacente para decidir si está & "; Seguro &"; o no. Por lo tanto, si no está utilizando la recolección de basura, para estar seguro, no debe reutilizar las variables como lo ha hecho. & Quot;

¡Pero el tipo .Net nunca usó declaraciones ilegales que causarían pérdidas de memoria! Las declaraciones anteriores son definitivamente legales y devolverán la cadena @ & Quot; ejemplo test & Quot ;.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top