3

そのため、コア イメージを使用してイメージにフィルターを適用してきました。同じフィルターを何度も適用しようとすると、アプリケーションが終了する以外はすべて問題ありません。メモリ リークだと思います。

コードは次のとおりです。

-(UIImage *) applyFilter: (UIImage*) picture
{

    UIImageOrientation originalOrientation = picture.imageOrientation;
    CGFloat originalScale = picture.scale;   


    CIImage *beginImage = [CIImage imageWithCGImage:picture.CGImage];  


    CIContext *context = [CIContext contextWithOptions:nil];

    CIFilter *filter = [CIFilter filterWithName:@"CISepiaTone" 
                                  keysAndValues: kCIInputImageKey, beginImage, 
                        @"inputIntensity", [NSNumber numberWithFloat:0.8], nil];

    CIImage *outputImage = [filter outputImage];

    CGImageRef cgimg = 
    [context createCGImage:outputImage fromRect:[outputImage extent]];
    UIImage *newImg = [UIImage imageWithCGImage:cgimg scale:originalScale orientation:originalOrientation];

    beginImage = nil;
    context = nil;
    filter = nil;
    outputImage = nil;
    cgimg = nil;
    [beginImage release];
    [context release];
    [filter release];
    [outputImage release];
    //CGImageRelease(CGImageRef) method.
    CGImageRelease(cgimg);

    return newImg;
}

そして、フィルタリングするには、私は単純に行います

UIImage *ima = [self.filter applyFilter:self.imageView.image];
imageView.image = ima ;

applyFilter は私が作成した Filter クラスのメソッドです

4

1 に答える 1

3

を呼び出す前に変数を nil に設定しているreleaseため、releaseは効果がありません。ただし、とにかくほとんどのものをリリースするべきではありません。作成したオブジェクトのみを解放する必要があります(次のリストが完全であることを願っています)。

  • alloc、、、initで始まるメソッドによって返された Objective-Ccopyオブジェクトnew
  • で始まる Objective-C メソッド、または または を含む関数によって返されるFoundationcreateオブジェクト。CreateCopy

これらの行を削除すると問題ありません。

beginImage = nil;
context = nil;
filter = nil;
outputImage = nil;
cgimg = nil;
[beginImage release];
[context release];
[filter release];
[outputImage release];

CGImageRelease(cgimg);取得に使用されるメソッドがcgimg含まれているため、行を保持する必要がありcreateます。作成して解放します。

于 2012-06-27T09:34:46.730 に答える