ビットマップデータを取得して 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];
}
ここで誰がどのメモリを所有しているかを正確に説明できる人はいますか? きれいに片付けたいけど、どうやって安全に片付けたらいいのかわからない。ドキュメントはこれらについて曖昧です。UIImagefree
を作成した後、この関数の最後でピクセル化してから UIImage を使用すると、クラッシュします。UIImage を作成した後にプロバイダーまたは imageRef を解放すると、クラッシュは見られませんが、明らかにピクセルがずっと通過しているように見えるため、これらの中間状態を解放することに慎重です。
(CF ドキュメントごとに、Create 関数から来ているため、後者の両方で release を呼び出す必要があることを知っていますが、UIImage が使用される前にそれを行うことはできますか?) おそらく、プロバイダーの dealloc コールバックを使用して、ピクセル バッファーをクリーンアップできます。 、しかし、他には何ですか?
ありがとう!