Bajo ARC, debería todavía envolver un @autoreleasepool en torno a la condición de tiempo?
Sí. Las piscinas de Autorelease todavía están en su lugar, y crecen y explotan como antes. El compilador simplemente agrega y combina las operaciones de retención y liberación necesarias cuando ARC está habilitado (haciéndose eco de Logan), según los métodos que son visibles para la TU y las convenciones de nomenclatura predeterminadas.
La ejecución en ARC es casi idéntica a la del recuento manual de referencias: todavía existen pilas de agrupaciones de almacenamiento automático. Una diferencia es que el compilador puede ordenar las operaciones de recuento de referencia ligeramente diferentes a la forma en que lo escribió (no de forma incorrecta), y puede omitir ciclos de retención innecesarios.
¿Es mejor preferir los métodos initWith ... siempre que sea posible?
WRT crecimiento minimizando montón en comparación con las contrapartes autoreleased: Si. Ese siempre ha sido el caso. Es especialmente importante en dispositivos iOS, donde la memoria es bastante limitada.
La excepción a esto es cuando el objeto puede evitar una asignación. Ejemplo:
NSString * copy = [NSString stringWithString:arg];
en este caso, copy
puede ser [[arg retain] autorelease]
. Tenga en cuenta que en este caso, copy
todavía se libera automáticamente, pero no debe hacer grandes esfuerzos para probar la presencia de tales optimizaciones. Nota: También es mejor usar copy = [arg copy]
... [arg release]
aquí.
La otra ventaja es que los desequilibrios de referencia se suelen detectar antes cuando el objeto nunca se libera automáticamente, y más cerca del sitio de llamada (en lugar de cuando finalmente se abre el Pool Autorelease).
El rendimiento con grandes pools de liberación automática es en realidad mucho peor de lo que la mayoría de la gente supondría. Si puede evitar depender mucho de ellos (por ejemplo, usando alloc
+ init
...+ release
), puede hacer que su programa sea notablemente más rápido. La creación explícita de grupos de liberación automática es económica y puede ayudar a minimizar este problema. Cuando las asignaciones son grandes y/o numerosas, evite usar autorelease
en ellas siempre que sea posible, y ajuste estas secciones en conjuntos de autorreleases explícitos.
¡Gracias por el gran enlace! –
Respuesta de Per @ Chuck: el @autoreleasepool necesita ir * dentro * del bucle para que le sirva de algo. La expresión idiomática es 'while (x) @autoreleasepool {...}', no '@autoreleasepool {while (x) {...}}'. – Quuxplusone
Esto es demasiado simplista e incorrecto. ARC a menudo puede optimizar el uso de distancia del grupo de autorrelease para los métodos que devuelven un objeto +0 (que es el uso más frecuente del uso de 'autorelease'). –