0

私はこのコードを書きました:

 bitmapData = calloc(1, bitmapByteCount );
 context = CGBitmapContextCreate (bitmapData,
                                 pixelsWide,
                                 pixelsHigh,
                                 8,
                                 bitmapBytesPerRow,
                                 colorSpace,
                                 kCGImageAlphaOnly);

これを行うと、CGBitmapContext が私の bitmapData をコピーするので、これらの行の後に書き込みを行う必要があります

free(bitmapData); 
4

2 に答える 2

5

必要な場合bitmapDataは解放しないでください。必要ない場合は、NULL代わりにパラメーターとして渡すと、Quartz 自体がメモリを割り当てます (iOS 4.0 以降)。

data : 描画がレンダリングされるメモリ内の宛先へのポインター。このメモリ ブロックのサイズは、少なくとも (bytesPerRow*height) バイトである必要があります。iOS 4.0 以降、および Mac OS X v10.6 以降では、Quartz にビットマップ用のメモリを割り当てる場合は NULL を渡すことができます。これにより、独自のメモリを管理する必要がなくなり、メモリ リークの問題が軽減されます。

しかし、Quartz は をコピーせずbitmapData、そこでレンダリングを行います。解放contextしたら、そのメモリを解放する必要があります。

編集: Apple サンプルプロジェクトの 1つでは、メモリは解放されますが、すぐには解放されません。

float drawStage3(CGContextRef context, CGRect rect)
{
    // ...
    cachedData = malloc( (((ScaledToWidth * 32) + 7) / 8) * ScaledToHeight);
    // ...
    bitmapContext = CGBitmapContextCreate(cachedData /* data */,
    // ...
    CFRelease(bitmapContext);
    // ...
    // Clean up
    CFRelease(cachedImage);
    free(cachedData);
}
于 2012-02-25T13:35:14.350 に答える
1

編集:

あなたのコードはcallocを介してメモリのブロックを割り当てています - あなたはそのメモリのブロックを所有しています。したがって、あなたはそのメモリを解放しています。CGBitmapContext create は、作成したメモリのブロックを使用してコンテキストを作成するだけです (これが、それを渡す必要がある理由です)。そのメモリ ブロックの処理が完了したら、それを解放する必要があります。

最初にコンテキストで CFRelease を実行します。コンテキストが作成するリソースはすべて、CFRelease によって処理されます。

Core Foundation Memory Guideの「Create Rule」には、次のように記載されています。

Core Foundation 関数には、返されたオブジェクトをいつ所有するかを示す名前があります。

名前に「Create」が埋め込まれたオブジェクト作成関数。名前に「コピー」が埋め込まれたオブジェクト複製関数。あなたがオブジェクトを所有している場合、それを使い終わったときに (CFRelease を使用して) 所有権を放棄するのはあなたの責任です。

于 2012-02-25T13:13:41.397 に答える