Pregunta

Esta es la esencia de algo de código que estoy escribiendo. Me preocupa que yo no estoy dirigiendo adecuadamente los retener / liberar problemas con el método de la clase en conjunto NSMutableArray. Es la siguiente memoria realidad fugas?

for(a while) { 
    // do stuff
    NSMutableArray *a = nil;
    // do stuff
    if (!a) {
        a = [NSMutableArray array];
    }
} // for(a while)
¿Fue útil?

Solución

Usted no perder memoria en este código, y la liberación de la matriz a sí mismo va a causar un accidente cuando la matriz se autoreleased al final del bucle de ejecución.

La mayoría de las clases de cacao proporcionan un par de maneras de hacer un nuevo objeto, y son muy consistentes con esta convención:

  1. [[NSSomeObject alloc] init]: usted es responsable de liberar el objeto (método de instancia)

  2. .
  3. [NSSomeObject someObject]: el objeto se autoreleased para usted, por lo general al final del bucle de ejecución (método de clase). Es más o menos equivalente a [[[NSSomeObject alloc] init] autorelease].

El uso apropiado del método de ejemplo sería:

a = [[NSMutableArray alloc] init];
// do stuff
[a release];

El uso apropiado del método de clase sería:

a = [NSMutableArray array];
// do stuff, array is in the autorelease pool

Tenga en cuenta que Apple ha recomendado que se mantenga alejado de los métodos de conveniencia tanto como sea posible para mejorar el rendimiento. Esta es consejos controvertido , no puede ahorrar mucho tiempo de procesador, y separa el alloc-init de la liberación en un objeto que en realidad no puede preocuparse mucho acerca de mantener.

Otros consejos

Desde el href="http://developer.apple.com/documentation/Cocoa/Conceptual/MemoryMgmt/Articles/mmRules.html" rel="nofollow Reglas Gestión de memoria de cacao :

  

Se toma la propiedad de un objeto si se crea empleando un método cuyo nombre comienza con “alloc” o “nuevo” o contiene “copia” (por ejemplo, alloc, newObject o mutableCopy), o si lo envía una retener el mensaje. Usted es responsable de renunciar a la propiedad de los objetos propia a partir de la liberación o autorelease. En cualquier otro momento que recibe un objeto, no se debe poner en libertad a él.

Por lo tanto con la línea:

a = [NSMutableArray array];

usted no toma la propiedad de la matriz, y se pasará a usted autoreleased. La memoria será manejado de forma automática en la piscina autorelease, y una vez que ya no se utiliza, se dará a conocer para usted. Si desea mantener la matriz fuera del evento actual, sin embargo, debe conservar, de lo contrario será lanzado para ti.

Sí, si usted quiere que se mantenga alrededor.

El objeto devuelto es un objeto autoreleased que conseguir desasignado cuando su piscina autorelease se purgó.

Todos los métodos de la clase matriz que comienzan con "matriz" vuelven estos tipos de objetos autoreleased.

Lea este doc por Apple.

Esto es válido. Se puede ayudar a manejar las cosas solo manualmente cuando tenga preguntas, para aprender.

Hay una convención:

  • prefijos init (init, initWithString :) indica una cuenta de retención de 1, donde
  • prefijos ObjectName (cadena, stringWithString :) indica un objeto autoreleased

he tenido la costumbre, desde hace años, para liberar lo que puede en el sitio de llamadas, en lugar de empujar a ser autoreleased. Algunos problemas se convierten entonces en autorelease dolorosamente difícil de localizar. Claro, autorelease es una conveniencia para el programador en este caso (siempre que nada salga mal), pero afecta negativamente a la reutilización, la claridad y el rendimiento (Moreso en grandes bases de código / programas).

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