Tengo una función que toma algunos datos de mapa de bits y devuelve un UIImage * de él. Parece algo así:¿Cuál es el patrón de administración de memoria correcto para buffer-> CGImageRef-> UIImage?
UIImage * makeAnImage()
{
unsigned char * pixels = malloc(...);
// ...
CGDataProviderRef provider = CGDataProviderCreateWithData(NULL, pixels, pixelBufferSize, NULL);
CGImageRef imageRef = CGImageCreate(..., provider, ...);
UIImage * image = [[UIImage alloc] initWithCGImage:imageRef];
return [image autorelease];
}
¿Alguien puede explicar exactamente quién posee qué memoria aquí? Quiero limpiarlo correctamente, pero no estoy seguro de cómo hacerlo de manera segura. Los documentos son borrosos en esto. Si yo free
píxeles al final de esta función después de crear el UIImage, y luego uso el UIImage, me cuelgo. Si lanzo el proveedor o el imageRef después de crear el UIImage, no veo un bloqueo, pero aparentemente están pasando los píxeles por completo, así que estoy asustado por la liberación de estos estados intermedios.
(Sé por CF documentos que debo llamar a la versión de estos últimos porque provienen de las funciones Crear, pero ¿puedo hacerlo antes de utilizar el UIImage?) Presumiblemente puedo usar la devolución de llamada dealloc del proveedor para limpiar el buffer de píxeles, pero ¿qué más?
Gracias!
Gracias Kenny. Esa es una descripción muy sucinta; Creo que me sorprendió un poco la imprevisibilidad del almacenamiento intermedio de pila en bruto, pero como siempre, confía en las reglas y serás recompensado. Aclamaciones. –
Solo para agregar algunas aclaraciones, las palabras clave en las funciones principales son "Crear" y "Nuevo". Si la función contiene cualquiera de estas palabras, debe liberar la memoria devuelta. La mayoría de los tipos de datos principales son compatibles con CFType. Lo que significa que puede usar el Objective-C para retener/liberar/liberar automáticamente las llamadas si es más fácil. es decir, el lanzamiento de [(id) imageRef]; o CFRelease (imageRef); –
Recuerde comprobar si 'imageRef' es' NULL' si usa 'CFRelease'. – kennytm