酢ろぐ!

カレーが嫌いなスマートフォンアプリプログラマのブログ。

iOSでCGBitmapContextCreateImage関数で生成したCGImageRefオブジェクトはCGImageRelease関数で解放しないといけない

今日ハマったコード。ループで処理を回しているとメモリ不足でクラッシュすることが判明した。サンプル的に作成しているアプリだったので品質は関係ないのでクラッシュしても良いのだが、あまりにも頻繁にクラッシュするので調査することにした。

元コードをコメントアウトしながら原因を追いかけた結果、以下のコードでリークしていることが分かった。

imageView.image = [UIImage imageWithCGImage:CGBitmapContextCreateImage(contextRef)];

CGBitmapContextCreateImage関数で生成したCGImageRefオブジェクトは、必ずCGImageRelease関数で解放する必要があるのですが、上記のコードのままだと解放することができません。

以下の通り書き換えたところ、メモリ使用量が安定してクラッシュすることがなくなりました。

CGImageRef markeredImageRef = CGBitmapContextCreateImage(contextRef);
imageView.image = [UIImage imageWithCGImage:markeredImageRef];
CGImageRelease(markeredImageRef);

InstrumentsのLeaksで拾えていなかったので、今日修正していなかったらハマってしまうところでした。