2

GPUImageで、画像(縦960x横1280)10枚に連続でセピアフィルターをかけています。
実行する約40MBぐらいメモリを消費し、確保された状態が続きメモリリークします。

以下の関数で実装しているんですが、戻り値を画面のUIImageView.imageに代入は行っていません。
ただ、以下の関数を10回実行するだけで、メモリリークします。

フィルタ処理が終わると、直ぐにメモリを開放したいのですが、やり方がわかりません。
アドバイスをお願い致します。

- (UIImage *)applyFilter:(UIImage *)target {
  GPUImagePicture *imagePicture = [[GPUImagePicture alloc] initWithImage:target];
  GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
  [imagePicture addTarget:sepiaFilter];
  [imagePicture processImage];
  UIImage *result = [sepiaFilter imageFromCurrentlyProcessedOutputWithOrientation:target.imageOrientation];
  [imagePicture removeAllTargets];
  [sepiaFilter removeAllTargets];
  return result;
}
kotatsu
  • 2,142
  • 4
  • 17
  • 31
sinsin
  • 538
  • 6
  • 21

1 Answers1

1

下記の環境で動作をチェックしましたが、自分の環境では、メモリリークが発生しませんでした。
forで回して、Arrayに格納して、全てがセピア加工されているのを確認しました。

環境
Xcode6.1.1
iPhone6
iOS8.1
GPUImage (0.1.6)

GPUImagePicture *imagePicture = [[GPUImagePicture alloc] initWithImage:target];
GPUImageSepiaFilter *sepiaFilter = [[GPUImageSepiaFilter alloc] init];
[imagePicture addTarget:sepiaFilter];

//下記を追加する必要があるようです。
[sepiaFilter useNextFrameForImageCapture];
[imagePicture processImage];

//最新では、imageFromCurrentFramebufferへ変更されているようです。
UIImage *result = [sepiaFilter imageFromCurrentFramebuffer];
[imagePicture removeAllTargets];
[sepiaFilter removeAllTargets];
yohjp
  • 10,194
  • 2
  • 22
  • 91
iwashiro
  • 306
  • 1
  • 3
  • 回答ありがとうございます。 GPUImageが古かったので、0.1.6 にして試してみました。 現象かわりませんでした。 メモリ使用量はxcodeにあるものをみているのですが、40MB増えたまま下がりませんでした。 – sinsin Feb 23 '15 at 03:56
  • 1
    @sinsin 自分は、メモリリークには詳しくないが、”applyFilter:”の引数で、”imageWithName:”(キャッシュされる)が使われている可能性や、GPUImage自体で、強参照が原因で開放されないなどがあるのかも知れない。 ”autoreleasepool {}”など試しましたが、確保されたメモリは開放されませんでした。自分の検証ではシミュレータで、45MB,実機で、15MBの表示され、memory leakの表示はされませんでした。 – iwashiro Feb 23 '15 at 07:44