2012-02-25 4 views

答えて

5

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

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

クォーツはbitmapDataをコピーしませんが、そこにレンダリングします。 contextをリリースしたら、そのメモリを解放する必要があります。

編集:アップルのサンプルprojectsの一つでは、メモリが解放され、即時ではありませんがされています

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); 
} 
+0

+1を渡してNULLを渡すポイントを更新します。 – bryanmac

1

EDIT足すべきであるので、私のBitmapDataをコピーCGBitmapContextさ:

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

私はCFReleaseをまずコンテキスト上で行います。コンテキストが作成するリソースは、CFReleaseによって処理されます。

Core Foundation Memory Guideが言うには、「ルールの作成」:

オブジェクト作成関数「作成」に埋め込まれています:

Core Foundationの機能を使用すると、 返されたオブジェクトを所有して時を示す名前を持っています名前; 名前に「コピー」が埋め込まれたオブジェクト複製機能。 あなたがオブジェクトを所有している場合は、完了した時点でオーナーシップ (CFReleaseを使用)を放棄するのはあなたの責任です。

+0

コンテキストがその配列をコピーしない、私はコンテキストを解放する必要があることを知っているが、私は明示的に私のBitmapDataを解放する必要がありますバイトの、またはちょうどそれを参照してください? – MegaManX

+0

申し訳ありませんが、私は誤解して、答えを – bryanmac

関連する問題