2012-09-19 12 views
23

Estoy tratando de encontrar otra pérdida de memoria en mi código, y parece que no puedo averiguar qué es CG Raster Data. Al pasar por el rastreador de VM con instantáneas automáticas habilitadas, el CG Raster Data parece ser la única parte que aumenta. Estos también aumentan constantemente sin que aumenten las asignaciones.¿Qué es CG Raster Data?

No estoy del todo seguro de lo que es el CG Raster Data, ni cómo lo arreglaría, pero en este momento el aumento de la huella causa un error de memoria y falla, ¡así que no es bueno! Hago mi propio procesamiento de texto (usando CoreText), así que estoy pensando que tiene algo que ver con eso. ¿También estoy cargando fotos?

A continuación se muestra una imagen de la huella: Peaks in the allocations when the pages load (the app loads pages with images and text discretely), the dirty memory always increases though.

ACTUALIZACIÓN: "NSConcreteGlyphGenerator" Este problema aún persiste, pero curiosamente me puede correlacionar a una fuga dentro UIFoundations a algo que se llama Parece suceder solo cuando llamo a un método "boundingRectWithSize:" en una cadena atribuida en el método CoreText que realmente dibuja. La línea, en concreto, es:

[displayString boundingRectWithSize:CGSizeMake(self.frame.size.width, self.frame.size.height) options:0 context:nil]; 

Lentamente seguimiento hacia abajo ...

+4

¿Alguna vez has imaginado ¿esta vez? Tengo este problema todavía en iOS 7. – Daniel

+0

¿Alguna actualización sobre esto? @Daniel –

Respuesta

1

Esto no es mucho de una respuesta, pero sólo para que alguien se inició la investigación ...

pienso CG Raster Data es nuevo con iOS 6, pero estuvo presente en iOS 5 como CG Image. Probé en ambos simuladores, y en iOS 5, CG Raster Data no estaba presente, pero si comparas las cantidades totales en iOS 6 e iOS 5, CG Image es casi igual a CG Raster Data, y CG Image no lo hace aparecer en iOS 6. Así que estoy bastante seguro de que simplemente cambiaron el nombre de CG Image a CG Raster Data.

En cuanto a lo que es CG Image, bueno, he estado tratando de resolver eso durante meses. Creo que es solo ver las cosas relacionadas con el diseño manejadas por el sistema, que realmente no controlas, porque mi aplicación realmente no tiene UIImages o CG Images, y mi memoria CG Image es bastante alta, así que es probable que sea algo que hacer con Core Animation y vista de diseño.

+0

"Imagen CG" todavía está presente es iOS 6, al menos en mi aplicación. –

+0

Ya, para mí también, aunque trazas muy pequeñas de eso ... mientras que en iOS 5 es de alrededor de 20 mb, en iOS 6 es de 32 kb como máximo. Entonces, cualquiera que sea la imagen CG, no juega un rol tan grande en iOS 6 – Snowman

12

No sé todo lo que podría contener "datos de trama CG", pero una cosa que sé con certeza que contiene es ... memoria asignada por Core Graphics para almacenar datos ráster, también conocidos como mapas de bits.

Específicamente, en mi aplicación, creo dos contextos de mapa de bits de 256x256 utilizando CGBitmapContextCreate. Paso NULL como el parámetro data, de modo que Core Graphics me asigna la memoria de mapa de bits. Un mapa de bits de 256x256 con 32 bits (4 bytes) por píxel toma 256 KiB = 64 páginas de 4 KiB cada una. En Instruments, obtengo dos bloques de "datos raster CG" de 65 páginas cada uno. Si hago un comentario sobre uno de esos contextos de mapa de bits, obtengo un solo bloque de "páginas de datos CG" de 65 páginas en Instruments. Por otra parte, también tengo un CATiledLayer en mi aplicación. El CATiledLayer establece sus propios contextos gráficos para que pueda dibujar, y creo que crea esos contextos utilizando memoria compartida que el servidor de ventanas (springboard en iOS 5, backboard en iOS 6) también accede directamente. No veo ningún bloque de "datos de trama CG" correspondiente a esos contextos gráficos.

0

Si le preocupa el uso de la memoria (89MB) es un poco. ¿Ha intentado simular una advertencia de memoria en el Simulador (Simulador> Hardware> Simular memoria de advertencia)?

Supongo que su memoria está siendo consumida por las imágenes.

más probable es que tenga que anular la planificación de sus imágenes mediante la observación del mensaje de aviso de memoria:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil]; 

Eliminar todos los objetos en su imagen handleMemoryWarning método.

+0

cómo borrar todas las imágenes? significa 'image = nil'? o 'self.view = nil'? – aircraft

2

Tuve el mismo problema con la memoria de datos de cuadrícula de CG aumentando simplemente presionando y soltando un controlador de vista repetidamente. Pasé un tiempo pensando que era un problema con algún código de dibujo. Finalmente lo rastreé a un delegado que no hacía referencia débilmente al controlador de vista que estaba siendo empujado y reventado, por lo que cuando abrí el controlador de vista, no fue desasignado. El CG Raster Data pasó a ser la mayor parte de la huella del controlador de esa vista, así que erróneamente atribuí el problema a eso inicialmente, cuando realmente era el controlador de vista el que no se estaba liberando (por lo tanto, no liberando sus vistas, algunas de que tenía CG Raster Data).

En resumen: si ve pérdidas de memoria con CG Raster Data, mire los controladores de vista que pueden tener vistas con ellos, y asegúrese de que se están liberando.

0

No es realmente una respuesta. Sin embargo, algunos más indicios de que me di cuenta, mientras que la solución de mi CG-trama-data-fugas:

  • el cg de raster de datos contiene la memoria de CGIMageRefs (al menos crean a partir de CGBitmapContextCreateImage() desde un contexto creado por CGBitmapContextCreate (NULL, ...)
  • mi fuga era una CGImageRelease() faltante. Utilicé la imagen para pasar como contenido de un CALayer y asumí que esta propiedad contiene la referencia. Pero parece que esta asignación copia la imagen. al menos no tengo ningún problema con llamar a CGImageRelease inmediatamente después de la asignación.

Espero que ayude a alguien ...

1

Cuando tuve un problema con esto, el "CG Raster Data" venía de una imagen que creé de una llamada a UIGraphicsGetImageFromCurrentImageContext desde dentro de UIGraphicsBeginImageContextWithOptions. Me llevó un día encontrar el problema, y ​​al final no estaba relacionado con la forma en que se creó la imagen. En mi caso, involuntariamente había pegado la imagen en una NSCache en otra parte del código, sin darme cuenta.

Si tiene un problema con el CG Raster Data no publicado, debe considerar que la fuente de donde se crearon los datos puede muy bien no tener nada que ver con el problema real. Podría ser que los datos de la imagen simplemente se conservan cuando no se espera que estén, y la etiqueta "CG Raster Data" que está viendo en Instruments solo se refiere a dónde se originaron los datos. Debes verificar para asegurarte de que no estás haciendo algo como multiple addSubviews mientras no puedes eliminar FromSuperview (con UIImageViews por ejemplo), o poner la imagen en un caché, una matriz, una variable fuerte, etc.

+0

Parece que tengo un problema muy similar. ¿Puede explicar el problema de colocar una imagen en una NSCache? – Kenneth

Cuestiones relacionadas