J'ai une fonction qui prend des données bitmap et renvoie un UIImage *. Il ressemble à quelque chose comme:Quel est le bon modèle de gestion de mémoire pour 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];
}
Quelqu'un peut-il expliquer exactement qui possède quelle mémoire ici? Je veux nettoyer correctement, mais je ne suis pas sûr de savoir comment le faire en toute sécurité. Les documents sont flous sur ceux-ci. Si je free
pixels à la fin de cette fonction après avoir créé l'UIImage, puis utiliser le UIImage, je plante. Si je libère le fournisseur ou l'imageRef après avoir créé l'UIImage, je ne vois pas de crash, mais ils passent apparemment les pixels complètement, donc je suis nerveux à propos de la libération de ces états intermédiaires.
(Je sais par CF docs que je devrais avoir besoin d'appeler release sur ces deux derniers parce qu'ils proviennent des fonctions Create, mais puis-je le faire avant l'utilisation de UIImage?) Je peux probablement utiliser le callloc callback du fournisseur nettoyer le tampon de pixels, mais quoi d'autre?
Merci!
Merci Kenny. C'est une description joliment succincte; Je pense que j'ai été un peu ébranlé par l'imprévisibilité du tampon de tas brut, mais comme toujours, faites confiance aux règles et vous serez récompensé. À votre santé. –
Juste pour clarifier, les mots clés dans les fonctions de base sont "Créer" et "Nouveau". Si la fonction contient l'un de ces mots, vous devez libérer la mémoire renvoyée. La plupart des types de données Core sont compatibles avec CFType. Ce qui signifie que vous pouvez utiliser les appels Objective-C retain/release/autorelease sur eux si c'est plus facile. c'est-à-dire [(id) imageRef release]; ou CFRelease (imageRef); –
N'oubliez pas de vérifier si 'imageRef' est' NULL' si vous utilisez 'CFRelease'. – kennytm