¿Cómo liberar CGImageRef si es necesario para devolverlo?

Tengo un método para cambiar el tamaño de un CGImageRef y devolver CGImageRef . El problema son las últimas líneas, donde de alguna manera tengo que liberar pero devolverlo después. ¿Algunas ideas? Gracias

  -(CGImageRef)resizeImage:(CGImageRef *)anImage width:(CGFloat)width height:(CGFloat)height { CGImageRef imageRef = *anImage; CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(imageRef); if (alphaInfo == kCGImageAlphaNone) alphaInfo = kCGImageAlphaNoneSkipLast; CGContextRef bitmap = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(imageRef), 4 * width, CGImageGetColorSpace(imageRef), alphaInfo); CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), imageRef); CGImageRef ref = CGBitmapContextCreateImage(bitmap); CGContextRelease(bitmap); CGImageRelease(ref); //issue here return ref; } 

La política de nomenclatura de administración de memory de Cocoa indica que usted es dueño de un object creado a partir de methods cuyo nombre comienza con asignar , copyr o nuevo .
El Clang Static Analyzer también respeta estas reglas.

Tenga en count que hay convenciones ligeramente diferentes para Core Foundation. Los detalles se pueden encontrar en la Guía de progtwigción avanzada de administración de memory de Apple .

Modifiqué su método anterior para ajustarse a las convenciones de nomenclatura. También anImage el asterisco al pasar por anImage , ya que CGImageRef ya es un puntero. (¿O fue esto a propósito?).
Tenga en count que posee la CGImage devuelta y tiene que CGImageRelease más tarde.

 -(CGImageRef)newResizedImageWithImage:(CGImageRef)anImage width:(CGFloat)width height:(CGFloat)height { CGImageAlphaInfo alphaInfo = CGImageGetAlphaInfo(anImage); if (alphaInfo == kCGImageAlphaNone) { alphaInfo = kCGImageAlphaNoneSkipLast; } CGContextRef bitmap = CGBitmapContextCreate(NULL, width, height, CGImageGetBitsPerComponent(anImage), 4 * width, CGImageGetColorSpace(anImage), alphaInfo); CGContextDrawImage(bitmap, CGRectMake(0, 0, width, height), anImage); CGImageRef image = CGBitmapContextCreateImage(bitmap); CGContextRelease(bitmap); return image; } 

También puede operar en el puntero anImage (después de eliminar el asterisco, como se sugiere @weichsel) y devolver void .

Sin embargo, debe leer su código y pensar en las preguntas:

  • ¿Quién es el propietario de anImage ? (claramente no es su método, ya que no retiene ni lo copy)
  • ¿Qué sucede si el propietario lo suelta mientras estás en tu método? (u otras cosas que podrían sucederle mientras se ejecuta su código)
  • ¿Qué le sucede después de que termine su método? (también: ¿recordaste lanzarlo en el código de llamada)

Por lo tanto, le recomiendo encarecidamente que no mezcle CoreFoundation, que funciona con funciones, pointers y estructuras de datos "clásicas", y Foundation, que funciona con objects y posts. Si desea operar en estructuras CF, debe escribir una function C que lo haga. Si desea operar en Foundation-objects, debe escribir (sub-) classs con methods. Si desea mezclar ambos o proporcionar un puente, debe saber exactamente lo que está haciendo y escribir las classs de contenedor que exponen una API de fundación y manejar todas las cosas de CF internamente (dejándolo así cuando libere estructuras).