Tanto retener y autorelease, funcionalmente retener un objeto, sino no se combinan. La diferencia es que los recuentos de retenciones solo pueden ser decrementados por otro objeto, mientras que los recuentos autoemitidos se disminuyen automáticamente cuando se vacía el NSAutoreleasePool. Si ningún otro objeto ha retenido el objeto liberado automáticamente en el momento en que la agrupación se vacía, se dispara.
Básicamente, usa la liberación automática cuando desea asegurarse de que un objeto se cuelga en el método actual y se puede pasar a otros objetos, pero no desea tener que rastrear su liberación usted mismo.
En su código de ejemplo, la liberación automática es solo una medida de seguridad. El objeto NSPredicate se libera porque su trabajo está terminado, pero el codificador quería asegurarse de que el objeto NSFetchRequest quedara colgado. No tiene que usar "liberación automática" en esta instancia, pero si perdió el conteo de sus lanzamientos, fetchRequest podría desaparecer.Por otro lado, no lo quiere huérfano y con fugas, por lo que usa la liberación automática para limpiar cuando el grupo está en desagües.
El uso más común de la liberación automática es cuando crea un número variable de objetos cada vez. No desea tener que rastrearlos a todos para poder soltarlos y dejar que el grupo los cumpla. (Aún mejor, creas un grupo local y lo drenas tan pronto como hayas terminado.)
En el estándar Apple API, cualquier método que crea un nuevo objeto sin las palabras clave 'init', 'new' o 'create 'devuelve un objeto liberado automáticamente.
-[NSString initWithString:]
no se autorrelease pero - [NSString stringWithString:] es. Esto causa problemas en entornos de recolección que no son de basura porque stringWithString:
devuelve una cadena que parece comportarse como un objeto retenido pero luego desaparecerá de forma aparentemente aleatoria cuando el grupo de liberación automática se creó en los desagües.
Edit01: De la Manzana Docs
piscina autorelease es una instancia de NSAutoreleasePool que “contiene” otros objetos que han recibido un mensaje de autorelease; cuando el grupo de autorretención se desasigna, envía un mensaje de liberación a cada uno de los objetos . Un objeto se puede poner en un grupo de liberación automática varias veces , y recibe un mensaje de liberación por cada vez que se puso en el grupo . Por lo tanto, el envío de autorelease en lugar de la liberación a un objeto se extiende la vida útil de dicho objeto en menos hasta la piscina en sí es liberado (el objeto puede sobrevivir más tiempo si se retiene en la provisional).
Los recuentos de retención y liberación automática mantienen un objeto vivo por el mismo mecanismo de conteo básico (pero separado). La principal diferencia es qué objeto propietario envía el lanzamiento. Con conteos retenidos, es otro objeto, pero para un recuento autorellenado es el grupo de autorrelease.
Esa es la explicación más sucinta que he leído para la liberación automática. – TechZen
¡Muy buena respuesta! +! –