2014年8月15日金曜日

【備忘録】画像処理アプリのメモリリーク対策

画像処理系のアプリでは、UIImageの中のdataを直接操作したい場合があると思います。
最近てこずっていたメモリリーク源は以下の記述。


 
//解放対象
CFMutableDataRef dataRefMutable1 = CFDataCreateMutableCopy(0, 0, dataRef);
//解放対象
CFDataRef outputData = CFDataCreate(NULL, buffer, CFDataGetLength(dataRefMutable1));
//解放対象
CGDataProviderRef dataProviderRef = CGDataProviderCreateWithCFData(outputData);
//解放対象
CGImageRef outputCgImage = CGImageCreate(width, height, bitsPerComponent, bitsPerPixel, bytesPerRow, colorSpace, bitmapInfo, dataProviderRef, NULL, shouldInterpolate, intent);

//作成したデータの解放
CFRelease(dataRefMutable1);
CFRelease(outputData);
CFRelease(dataProviderRef);
CGImageRelease(outputCgImage);


上記4点は必ず解放する必要がありそうです。
また、画像処理が終わっていないのに再処理しようとするとメモリの異常アクセスが発生してアプリが落ちる事があります。(特に画像サイズが1000x1000等大きい場合)

その場合、画像処理はスレッドで行いながらプログレスバーやくるくるを表示して、処理中はフラグ等で再処理されないよう管理する必要が有ります。

それらに注意したらスムーズに動作するようになりました。
Objective-Cのメモリ管理は難しくてまだまだ勉強する必要が有りそうですね。

0 件のコメント:

コメントを投稿