2011-06-18 19 views
28

Sé que hay un grupo de autorrelease creado en el método principal y todos los objetos que reciben mensaje de liberación automática se almacenan en este grupo y se liberan cuando el grupo se agota.¿Por qué utilizar Autorelease pool?

Pero siempre se dice que evita la autorrellencia de objetos para evitar pérdidas de memoria y, a su vez, bloqueos de aplicaciones.

¿Entonces por qué y en qué condiciones debemos usar autoreleasepool?

Los documentos de Apple sugieren que debemos usarlos cuando estamos usando subprocesos, por lo que al principio de un subproceso necesitamos crear un grupo de autorrelease y al final del subproceso drenarlo, pero ¿qué ocurre si no estamos creando una liberación automática? objeto en el hilo completo, entonces en esa condición también es necesario crear un grupo de liberación automática al comienzo del hilo.

Por favor, elimine mi confusión. Gracias.

Respuesta

19

Su suposición es correcta. Cuando puede asegurarse de que un hilo específico nunca haga uso de objetos liberados automáticamente, ese hilo no necesitaría un grupo de autorrelease.

Evitar el autoreleasepool es un mal consejo, la moneda tiene dos lados. El uso de objetos liberados automáticamente conlleva una cierta cantidad de sobrecarga (aunque insignificante en la mayoría de los escenarios) que debe evitarse cuando sea posible. Especialmente en los casos en que hay múltiples salidas a un método, o se puede encontrar una excepción, el autorrelleno ayuda a evitar fugas de memoria y hace que el código sea más limpio.

Sin embargo, tenga en cuenta que esto no significa que nada en ese hilo pueda usar la liberación automática, incluidos los marcos a los que pueda llamar. Hay situaciones en las que este es el caso, como en un escenario clásico de productor/consumidor. Usted tiene un productor que crea objetos, los distribuye a los hilos principales runloop, y puede registrarlos en los hilos principales de liberación automática en consecuencia.

En general, no recomendaría crear un hilo donde se lleve a cabo un trabajo significativo (además de un cálculo simple y de larga ejecución) sin un autoreleasepool.

+0

¿La creación de un subproceso sin grupo de autorrelleno provoca la pérdida de memoria? –

+2

Sí, si sueltas automáticamente un objeto en ese hilo y no hay grupo, tendrás una fuga. –

+0

Ese es controvertido. http://stackoverflow.com/questions/12575010/using-arc-is-it-fatal-not-to-have-an-autoreleasepool-for-every-thread –