2011-08-13 7 views
3

私はビットマップコンテキストを解放する方法を理解していません。CGBitmapContextメモリリークを作成しますか?

私は、次のやってる:

CGContextRef context = CGBitmapContextCreate(nil, size.width, size.height, 8, 0, CGColorSpaceCreateDeviceRGB(), kCGBitmapAlphaInfoMask); 
. 
. // (All straightforward code) 
. 
CGContextRelease(context); 

Xcodeは、まだ分析してくれCGBitmapContextCreateラインの「潜在的なメモリリーク」を与えます。

私は間違っていますか?

答えて

7

CGColorSpaceCreateDeviceRGB()の結果を変数に代入しないので、そのメソッドによって作成されたオブジェクトへの参照が緩くなります。
後で色空間オブジェクトを解放するには、その参照が必要です。 Core Graphicsは、Core Foundationのメモリ管理ルールに従います。 詳細については、hereをご覧ください。あなたのコードの

固定バージョン:

CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
CGContextRef context = CGBitmapContextCreate(nil, size.width, size.height, 8, 0, colorSpace, kCGBitmapAlphaInfoMask); 
. 
. // (All straightforward code) 
. 
CGContextRelease(context); 
CGColorSpaceRelease(colorSpace); 

あなたがソースのコードアナライザ場所青いアイコンをクリックすると、あなたはあなたのリークの起源を示し、矢印のグラフを得ます。 (私はそれがあなたが色空間を作成する行を指すと仮定します)

+0

私は同じ問題がありますが、あなたのコードを使用すると、私のCGContextRefはnullになります。私は色空間を解放するために後でより冷たい空間でそのオブジェクトを参照する場合を意味します。その場合、私のコンテキストはnullです。 –

+1

CGBitmapContextCreateに間違った値を渡すことがあります。コンテキストの作成に失敗した場合、このメソッドはNULLを返します。 –

+0

はい私は幅と高さの両方の値をチェックしましたが、それは答えの最後の部分には –

2

色空間オブジェクトがCGColorSpaceCreateDeviceRGB()呼び出しから漏れています。色空間も解放する必要があります。