No es la cuestión de usar o no usar autorelease, porque en algunos casos autorelease es la única manera que obtendrá a través. La pregunta debería ser "¿Por qué no utilizar la liberación automática en todos los objetos, en lugar de usar retener y liberar?".
Para responder a eso, primero debe aprender lo que es un uso adecuado de autorelease. Digamos que tiene una clase que tiene dos propiedades: firstName y lastName. Hay un getter y un setter para cada uno. Pero también es necesario un método que devolvería fullName, mediante la concatenación de estos dos cadenas en una nueva cadena de marca:
- (NSString *) fullName {
NSString str = [[NSString alloc]initWithFormat:@"%@ %@", firstName, lastName];
// this is not good until we put [str autorelease];
return str;
}
¿Qué pasa con esa imagen? El recuento de referencias en la cadena devuelta es 1, por lo que si no desea filtrar, la persona que llama debe liberarlo cuando haya terminado.Desde el punto de vista de la persona que llama, acaba de solicitar un valor de propiedad fullName
. ¡No tiene conocimiento del hecho de que recibió un nuevo objeto que debería liberar después de su uso, y no de una referencia a un NSString que pertenece a la clase!
Si ponemos el [str release]
antes de devolver, la cadena se destruiría y el método devolvería la basura. Ahí es donde usamos [str autorelease]
, para marcar el objeto para su lanzamiento en un momento posterior (generalmente cuando se realiza el procesamiento del evento). De esa manera, la persona que llama obtiene su objeto, y no tiene que preocuparse de si debe liberarlo o no.
La convención es llamar a la liberación automática en un nuevo objeto antes de que el método lo devuelva a la persona que llama. Las excepciones son métodos con nombres que comienzan con alloc
, new
o copy
. En tales casos, las personas que llaman saben que se les ha creado un nuevo objeto y que es su deber solicitar la liberación de ese objeto.
Reemplazar la liberación con la liberación automática es una mala idea, ya que los objetos se amontonarían y atascarían la memoria muy rápidamente, especialmente en los bucles. Los recursos en el iPhone son limitados, por lo que para minimizar el acaparamiento de memoria, es su deber liberar el objeto tan pronto como haya terminado con él.
contento de ayudarme (me dieron algo para buscar :-) – TofuBeer
Lo que no mencionan es muchas de las clases en la llamada de recuperación automática sobre los objetos que administran y por lo tanto en bucles estrechos necesitas crear y administrar tu propios grupos de autorreleases si está procesando incluso una cantidad modesta de datos. – rpetrich
No creo que sea costoso mantener el grupo; más bien, es mejor no tener memoria asignada pero no utilizada más de lo necesario en un entorno de memoria limitada. Autorelease deja la memoria asignada más tiempo de lo necesario. – Paul