2

アプリ画面の1つにぼかし画像を作成しています。このため、次のコードを使用しています


UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];


CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:5] forKey:@"inputRadius"];
CIImage *result = [filter valueForKey:kCIOutputImageKey];

CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

blurrImage = [UIImage imageWithCGImage:cgImage];
  self.blurrImageView.image = blurrImage;
  CGImageRelease(cgImage);


上記のコードから正しいぼかし画像が得られますが、問題は CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];この行にあります。

この行まではメモリ使用量の表示は正常ですが、この行の後でメモリ使用量が異常に高くなり、

実行前に表示されるメモリ使用量のスクリーンショットです。メモリ使用量は、このメソッドの実行に沿って増加し続けます。これは前です

ここに画像の説明を入力

そして、これは行の実行後 CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

ここに画像の説明を入力

これは一般的な動作ですか..?私は答えを検索しましたが、私は得られなかったので、同じ問題に直面した人はこれについて私を助けてください

私が「ARCを使用していない」ということの1つ

4

2 に答える 2

1

スクリーンショットを使用しているという事実は、メモリ使用量を変える可能性があり、Retina ディスプレイでは通常のデバイスよりも多くなる可能性があります。私の意見では、元の UIImage とぼかし画像がメモリ内に存在するため、二重化は問題ありません。おそらくコンテキストもメモリを保持します。私は推測します:

  • 多くの自動解放されたオブジェクトを使用しています。それらはプールが空になるまでメモリに残ります。コードを autoreleaseblock にラップしてみてください。


@autoreleasepool{
 UIGraphicsBeginImageContext(self.view.bounds.size);
[self.view.layer renderInContext:UIGraphicsGetCurrentContext()];
UIImage *image = UIGraphicsGetImageFromCurrentImageContext();
UIGraphicsEndImageContext();

CIContext *context = [CIContext contextWithOptions:nil];
CIImage *inputImage = [CIImage imageWithCGImage:image.CGImage];


CIFilter *filter = [CIFilter filterWithName:@"CIGaussianBlur"];
[filter setValue:inputImage forKey:kCIInputImageKey];
[filter setValue:[NSNumber numberWithFloat:5] forKey:@"inputRadius"];
CIImage *result = [filter valueForKey:kCIOutputImageKey];

CGImageRef cgImage = [context createCGImage:result fromRect:[inputImage extent]];

blurrImage = [UIImage imageWithCGImage:cgImage];
  self.blurrImageView.image = blurrImage;
  CGImageRelease(cgImage);
}
于 2013-12-17T06:57:12.420 に答える