0

私のアプリは画像パスの配列をループし、それらすべての画像を1つにマージします。コードは以下のとおりです。ただし、コンソールで(gdb)を印刷した画像をリリースすると、アプリがクラッシュします。イメージリリースラインを削除すると、正常に動作しますが、メモリリークが発生する可能性があります。このコードを見て、なぜこれが発生するのか、何を改善できるのかを説明してください。ありがとうございました。

UIGraphicsBeginImageContextWithOptions(CGSizeMake(width*len+padding*len+padding,
                                                  height+padding*2), 
                                       YES, 0.0);
do{

        //draw image
        path = (NSString*)[_imageData objectAtIndex:i];
        UIImage * img = [[[UIImage alloc] initWithContentsOfFile:path]
                           cropCenterAndScaleImageToSize:CGSizeMake(width, height)];
        [img drawAtPoint: CGPointMake(width*i+padding*i+padding,padding) blendMode:kCGBlendModeNormal alpha:1];
        [img release]; //APP CRASHES HERE BUT WORKS IF THIS LINE REMOVED
        i++;
    }while (i<len);
    UIImage *result = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    UIImageWriteToSavedPhotosAlbum(result, self,
                                   @selector(image:didFinishSavingWithError:contextInfo:),
                                   nil);
4

1 に答える 1

3

問題は、割り当てられたイメージを解放していないことです。自動解放されたトリミングされた画像を解放し、割り当てられた画像をリークしています。

これを変える:

UIImage * img = [[[UIImage alloc] initWithContentsOfFile:path]
                   cropCenterAndScaleImageToSize:CGSizeMake(width, height)];
[img drawAtPoint: CGPointMake(width*i+padding*i+padding,padding) blendMode:kCGBlendModeNormal alpha:1];
[img release];

に:

UIImage *original = [[UIImage alloc] initWithContentsOfFile:path];
UIImage *cropped = [original cropCenterAndScaleImageToSize:CGSizeMake(width, height)];
[cropped drawAtPoint:CGPointMake(width * i + padding * i + padding, padding) blendMode:kCGBlendModeNormal alpha:1];
[original release];

cropCenterAndScaleImageToSize:自動解放された参照を返すカテゴリメソッドであると想定していますUIImage

于 2013-01-17T22:36:02.743 に答える