Pourquoi dois-je libérer ces données? Suis-je le propriétaire?

Cela est étrange. Dans un Q & A technique , Apple dit ceci:

void *data = CGBitmapContextGetData (cgctx); if (data != NULL) { // **** You have a pointer to the image data **** // **** Do stuff with the data here **** } // When finished, release the context CGContextRelease(cgctx); // Free image data memory for the context if (data) { free(data); } 

J'ai recherché la documentation pour CGBitmapContextGetData, et il ne mentionne pas que je suis responsable de la libération des données quand j'appelle cela. Il y a déjà l'appel CGContextRelease qui nettoie le context.

Quel est le sharepoint devoir extrader datatables dans le context? C'est juste un pointeur vers ces données, n'est-ce pas? Pourquoi appellent-ils free(data) ici?

Mise à jour : j'ai négligé de lire l'exemple complet du code. Apple alloue bitmapData dans CreateARGBBitmapContext() mais ne le libère pas. Ce qui est parfaitement bien, puisque le context doit encore s'y attacher.

Cependant, bitmapData devra être libéré plus tard quand le dessin sera terminé, ce qui est exactement ce qu'ils font à la fin de ManipulateImagePixelData() . Donc, bien qu'il soit inhabituel de libérer quelque chose qui a été obtenu par une fonction get, le code de l'échantillon est correct .

Pour éviter la confusion de libérer quelque chose qui a été renvoyé par une fonction get, on peut vouloir stocker datatables bitmap dans une variable globale / instance et free() lorsque c'est fait.


Je suppose que c'est un bug dans l'exemple de code. La documentation de cette fonction ne mentionne rien de spécial, il n'y a donc aucune raison pour que la règle Get ne s'applique pas ici. La documentation 2D Quartz callbackle également spécifiquement que le model de gestion de memory CoreFoundation s'applique à l'API 2D Quartz.

Je suis 100% familier avec le encoding de tout ce qui concerne Apple, mais j'imagine que le cgctx n'a rien à voir avec le pointeur de données, donc vous devriez le libérer tout seul. IE Le CGContextRelease () ne nettoie pas le pointeur.