Pregunta

Estaba leyendo los documentos de arco en el sitio LLVM: http://clang.llvm.org/docs/automaticreferenceCounting.html#autoreleasepool

.. en particular sobre @autoreleasepool.

En mucha implementación actual utilizando nsautoreleasePool, veo casos en los que el grupo se drena periódicamente durante una iteración de bucle: ¿cómo hacemos lo mismo con @AutorLease Pool, o está todo hecho para nosotros de alguna manera debajo del capó?

En segundo lugar, los Docs afirman que si se lanza una excepción, el grupo no está drenado ... OK Las excepciones son, por su nombre, excepcionales, pero si suceden, es posible que desee recuperarse sin filtrar una carga de memoria. Los documentos no especifican cuándo se lanzarán estos objetos.

¿Alguien tiene información sobre estos puntos?

¿Fue útil?

Solución

En mucha implementación actual utilizando nsautoreleasePool, veo casos en los que el grupo se drena periódicamente durante una iteración de bucle: ¿cómo hacemos lo mismo con @AutorLease Pool, o está todo hecho para nosotros de alguna manera debajo del capó?

De la misma manera, es decir, en cascada en las piscinas de autores. Por ejemplo:

@autoreleasepool {
    …
    for (int i = 0; i < MAX; i++) {
        @autoreleasepool {
            …
        }
    }
    …
}

En segundo lugar, los Docs afirman que si se lanza una excepción, el grupo no está drenado ... OK Las excepciones son, por su nombre, excepcionales, pero si suceden, es posible que desee recuperarse sin filtrar una carga de memoria. Los documentos no especifican cuándo se lanzarán estos objetos.

En la mayoría de los casos, el programa no podrá recuperarse con gracia debido a la naturaleza peculiar de las excepciones en el cacao, por lo que diría que la fuga de objetos es un problema menor. Si una @autoreleasepool BLOCK se sale debido a una excepción, los objetos autorelados correspondientes solo se lanzarán cuando aparezca uno de los grupos de autorlease de adjunto. Pero puedes, por supuesto, colocar @try/@catch/@finally bloques dentro del @autoreleasepool Bloquee para evitar que esto suceda.

Otros consejos

¿Cómo hacemos lo mismo con @AutorElease Pool?

Como esto:

for (int i = 0; i < 10000; i++) {
    @autoreleasepool {
        // Do your work here
        ...
    }
}

En segundo lugar, los Docs afirman que si se lanza una excepción, el grupo no está drenado ... OK Las excepciones son, por su nombre, excepcionales, pero si suceden, es posible que desee recuperarse sin filtrar una carga de memoria.

AFAIK Esto no es posible con ARC. ARC no es excepcional en absoluto. Si se produce una excepción, existe la posibilidad de fugas de memoria no recuperables. El código que usa ARC no debe depender de excepciones para informar errores. La expectativa es que el proceso se bloquea de todos modos cuando se plantea una excepción.

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