0

他の誰かがこの問題に遭遇しましたか?ObjectAllocは、CGBitmapContextCreateImageの結果として上昇します。Appleのソフトウェアはobjectallocを完全にリリースしていませんか?

NSTimerを使用して1秒間に12回画像のサイズを変更しています。画像のサイズ変更中に、interpolationQualityを含めることで、ガウスぼかし効果のようなフォトショップも追加します。

Instrumentsを使用した後、メモリリークは表示されませんが、objectallocは上昇し続けます。CGBitmapContextCreateImageを直接指します。
CGBitmapContextCreateImage>create_bitmap_data_provide>malloc

誰かが解決策を知っていますか?または可能なアイデアでさえ?

NSTimer内の呼び出し

NSString * fileLocation = [[NSBundle mainBundle] pathForResource:imgMain ofType:@"jpg"];
NSData * imageData = [NSData dataWithContentsOfFile:fileLocation];
UIImage * blurMe = [UIImage imageWithData:imageData];

CGRect rect = CGRectMake(0, 0, round(blurMe.size.width /dblBlurLevel), round(blurMe.size.width /dblBlurLevel)); 
UIImage * imageShrink = [self resizedImage: blurMe : rect : 3.0];   

CGRect rect2 = CGRectMake(0, 0, blurMe.size.width , blurMe.size.width ); 
UIImage * imageReize = [self resizedImage: imageShrink : rect2 : 3.0];

imgView.image = imageReize;

サイズ変更機能

-(UIImage *) resizedImage:(UIImage *)inImage : (CGRect)thumbRect : (double)interpolationQuality
{
    CGImageRef                  imageRef = [inImage CGImage];
    CGImageAlphaInfo    alphaInfo = CGImageGetAlphaInfo(imageRef);

    if (alphaInfo == kCGImageAlphaNone)
        alphaInfo = kCGImageAlphaNoneSkipLast;

    // Build a bitmap context that's the size of the thumbRect
    CGContextRef bitmap = CGBitmapContextCreate(
                                NULL,
                                thumbRect.size.width,
                                thumbRect.size.height,          
                                CGImageGetBitsPerComponent(imageRef),
                                4 * thumbRect.size.width,       
                                CGImageGetColorSpace(imageRef),
                                alphaInfo
                                );

    // Draw into the context, this scales the image
    CGContextSetInterpolationQuality(bitmap, interpolationQuality);
    CGContextDrawImage(bitmap, thumbRect, imageRef);

    // Get an image from the context and a UIImage
    CGImageRef  ref = CGBitmapContextCreateImage(bitmap);
    UIImage*    result = [UIImage imageWithCGImage:ref];

    CGContextRelease(bitmap);   // ok if NULL
    CGImageRelease(ref);

    return [result autorelease];
}
4

2 に答える 2

1

そのコードはオーバーリリースresultです。

つまり、UIImage の割り当てが解除されておらず、UIImage が CGImage を保持しており、CGImage が CGBitmapContextCreate で割り当てられたメモリを保持している可能性があります。

計測器を使用して、UIImages の割り当てが解除されていないかどうかを確認し、そうである場合はその理由をデバッグしてみてください。

于 2009-09-17T02:52:11.277 に答える
-1

あなたのコードをそのままコンパイルして実行しましたが、リークは見られず、オブジェクトの割り当てが増え続けていません。コードを 1 秒間に数回実行しましたが、Instruments でオブジェクトの増加は見られません。私はシミュレーターでのみ実行しています。それが問題である場合に備えて、3.0 の代わりに kCGInterpolationNone も試しましたが、それでもリークはありません。

なぜ私がそれらを取得しないのかわかりません。あなたは取得します。メソッドでこれを行うだけでよい場合があります。

-(UIImage *) resizedImage:(UIImage *)inImage : (CGRect)thumbRect : (double)interpolationQuality
{
    CGImageRef                  imageRef = [inImage CGImage];
    CGImageAlphaInfo    alphaInfo = CGImageGetAlphaInfo(imageRef);

    return inImage;
...

このメソッドを無意味にするには、オブジェクトの割り当てが増え続けるかどうかを監視します。もしそうなら、問題は別のところにあります。

于 2009-09-17T03:00:06.070 に答える