objective c - ¿Qué es CG Raster Data?
objective-c ios (6)
Estoy tratando de encontrar otra pérdida de memoria en mi código, y parece que no puedo averiguar qué es CG Raster Data. Mientras se realiza el VM Tracker con las instantáneas automáticas habilitadas, los datos ráster CG parecen ser la única parte que aumenta. Estos también aumentan constantemente sin aumentar las asignaciones.
No estoy completamente seguro de qué es el CG Raster Data, ni cómo lo arreglaría, pero en este punto, el aumento de la huella eventualmente causa un error de memoria y falla, ¡así que no es bueno! Hago mi propio renderizado de texto (usando CoreText), así que creo que tiene algo que ver con eso. También estoy cargando fotos?
A continuación se muestra una imagen de la huella:
ACTUALIZACIÓN: este problema aún persiste, pero curiosamente puedo correlacionarlo con una fuga dentro de UIFoundations a algo llamado "NSConcreteGlyphGenerator". Parece suceder solo cuando invoco un método "boundingRectWithSize:" en una cadena atribuida en el método CoreText que realmente dibuja. La línea, específicamente, es:
[displayString boundingRectWithSize:CGSizeMake( self.frame.size.width, self.frame.size.height ) options:0 context:nil];
Lentamente rastreando hacia abajo ...
Cuando tuve un problema con esto, los "datos ráster CG" procedían de una imagen que creé desde una llamada a UIGraphicsGetImageFromCurrentImageContext desde dentro de un UIGraphicsBeginImageContextWithOptions. Me tomó un día rastrear el problema, y al final no estaba relacionado con cómo se hizo la imagen. En mi caso, había pegado inadvertidamente la imagen en un NSCache propio en otra parte del código, sin darme cuenta.
Si tiene un problema con CG Raster Data que no se está publicando, debe tener en cuenta que la fuente donde se crearon los datos puede no tener nada que ver con el problema real. Podría ser que los datos de la imagen simplemente se retengan cuando no se espera que lo estén, y la etiqueta de "Datos ráster CG" que está viendo en Instrumentos solo se refiere al lugar donde se originaron los datos. Debes verificar para asegurarte de que no estás haciendo algo así como varios addSubviews al no poder quitarFromSuperview (con UIImageViews por ejemplo), o poner la imagen en un caché, una matriz, una variable fuerte, etc.
Esto no es una gran respuesta, pero solo para que alguien comience la investigación ...
Creo que CG Raster Data es nuevo con iOS 6, pero estaba 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 y iOS 5, CG Image es casi igual a CG Raster Data, y CG Image no lo hace. Aparece 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 realmente es CG Image, bueno, he estado tratando de resolverlo durante meses. Creo que es solo ver las cosas relacionadas con el diseño que maneja el sistema, que realmente no controlas, porque mi aplicación no tiene UIImages ni CG Images, y mi memoria de imagen CG es bastante alta, por lo que probablemente sea algo que hacer. Con Core Animation y diseño de vista.
No es realmente una respuesta. Pero algunos consejos más que descubrí mientras resolvía mi CG-raster-data-leak:
- cg-raster-data contiene la memoria de CGIMageRefs (al menos creada a partir de CGBitmapContextCreateImage () de un contexto creado por CGBitmapContextCreate (NULL, ...)
- mi fuga fue un CGImageRelease faltante (). Usé la imagen para pasarla 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 justo después de la asignación.
Espero que ayude a alguien ...
No sé todo lo que puede contener "datos ráster CG", pero una cosa que sé con certeza es que contiene ... 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 CGBitmapContextCreate
usando CGBitmapContextCreate
. Paso NULL
como el parámetro de data
, por lo que Core Graphics asigna la memoria de mapa de bits para mí. 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 Instrumentos, obtengo dos bloques de “datos ráster CG” de 65 páginas cada uno. Si comento uno de esos contextos de mapa de bits, solo obtengo un bloque de “datos ráster CG” de 65 páginas en Instrumentos.
Por otro lado, también tengo un CATiledLayer
en mi aplicación. El CATiledLayer
configura sus propios contextos gráficos para que los dibuje, y creo que crea esos contextos utilizando la memoria compartida a la que también accede directamente el servidor de ventanas ( springboard
en iOS 5, backboard
en iOS 6). No veo ningún bloque de "datos ráster CG" correspondiente a esos contextos gráficos.
Si te preocupa el uso de memoria (89MB) es un poco. ¿Ha intentado simular una advertencia de memoria en el simulador (Simulador> Hardware> Simular advertencia de memoria)?
Mi conjetura es que la memoria está siendo usada por las imágenes.
Es probable que necesite desasignar sus imágenes observando el mensaje de advertencia de memoria:
[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];
Borra todos tus objetos de imagen en el método handleMemoryWarning
.
Tuve el mismo problema con el aumento de la memoria de datos ráster CG al presionar y abrir un controlador de vista repetidamente. Pasé un rato pensando que era un problema con algún código de dibujo. Finalmente lo localicé con un delegado que no hacía una referencia débil al controlador de vista que estaba siendo empujado y que saltó, por lo que cuando abrí el controlador de vista, no se lo desasignó. La CG Raster Data resultó ser la mayor parte de la huella de ese controlador de vista, por lo que atribuí erróneamente el problema a eso inicialmente, cuando en realidad era el controlador de vista el que no se estaba publicando (por lo tanto, sin publicar sus puntos de vista, algunos el cual tenia CG Raster Data).
En resumen: si está viendo fugas de memoria con CG Raster Data, mire los controladores de vista que puedan tener vistas con ellos, y asegúrese de que estén siendo liberados.