¿Cómo liberar memory en ARC para renderizar charts con alto uso de memory?

En primer lugar, gracias a todos en este sitio … ha sido INCREÍBLEMENTE útil para entrar en el grano de la progtwigción de iOS.

Mi problema actual:

Tengo una aplicación que muestra una versión muy estilizada de una foto. Utiliza algunos filters CoreImage para algunos de ellos, pero necesita una gran cantidad de CoreGraphics para get el image processing pesado.

El tamaño del proxy hace que funcione bien, pero cuando renderizo una versión de resolución completa de mi image, a veces se bloquea debido al alto uso de memory. El problema es que necesito poder almacenar varios búferes de resolución completa (3264×2448) en la memory al renderizar. No sé qué o cómo liberar más memory. He sido muy cuidadoso al hacer coincidir CGImageRelease en todas partes que pueda.

Y con ARC, ¿cómo puedo saber si algo realmente se ha liberado y liberado? Establecer un object a cero realmente no hace nada.

Y dudo que pueda transmitir esto al disco de alguna manera.

¡CUALQUIER sugerencia sería muy apreciada!

¡GRACIAS!

ARC no hace la diferencia en ese context.

Simplemente significa que no tienes que llamar a la release por ti mismo.

Con no ARC, en condiciones de poca memory, es posible que desee lanzar algunas properties que realmente no necesita (lo que significa que se pueden volver a crear a pedido).

 - ( void )didReceiveMemoryWarning: { [ _myProperty release ]; _myProperty = nil; [ super didReceiveMemoryWarning ]; } 

En ARC, es exactamente el mismo, excepto que no tiene que llamar a la release :

 - ( void )didReceiveMemoryWarning: { _myProperty = nil; [ super didReceiveMemoryWarning ]; } 

La configuration de su propiedad a nil , bajo ARC, lo liberará automáticamente.
Entonces realmente hace algo.

Si no funciona para ti, definitivamente tienes otro problema.
Asegúrese de no tener pérdidas de memory ni retener ciclos .

El último es ciertamente el problema …

Como se ha sugerido (pero no se indica explícitamente), este no es un problema de ARC.

Va a necesitar 30 MB de memory para almacenar una sola image en la memory de esa resolución (3264×2448, suponiendo 32 bits por píxel). Y aunque no dices cuántos tampones de ese tamaño necesitas en la memory, parece que son al less tres: básicamente estás en el límite de memory para muchos dispositivos iOS (el iPad y el iPhone 3GS originales solo tienen 256 MB en total . De eso, es posible que solo tenga acceso a un tercero. La memory disponible para su aplicación es muy variable).

ARC no es como la recolección de basura: simplemente agrega el release y retain declaraciones en la compilation. Si ha estructurado su código correctamente, sus imágenes se lanzarán cuando ya no sean necesarias. Sospecho que si desactivas ARC (lo que puedes hacer en un file por file, usando una bandera de comstackdor), verías los mismos resultados.

Como alguien ya ha publicado, la forma de evitar esto es mosaicar su image y trabajar en una pequeña muestra a la vez. Si su algorithm de desenfoque no puede hacer frente a eso, entonces la dura verdad es que probablemente tendrá que escribir una que lo haga.

Debe colocar su image en mosaico y solo trabajar en partes a la vez. Puede hacer esto creando su CIImage y luego llamando:

 [myContext drawImage:myImage atPoint:P fromRect:tileBounds]; 

en un ciclo y cambiando P y tileBounds para que eventualmente cubra todo el área de la image de salida.