申し訳ありません。このメモリリークを追跡するのが難しい世界です。このスクリプトを実行すると、メモリが漏れることはありませんが、私のobjectallocは上昇しています。 InstrumentsはCGBitmapContextCreateImage> create_bitmap_data_provider> mallocを指していますが、これは私のobjectallocの60%を占めています。iPhone - UIImage Leak、CGBitmapContextCreateImage Leak
このコードは、NSTimerで数回呼び出されます。
//GET IMAGE FROM RESOURCE DIR
NSString * fileLocation = [[NSBundle mainBundle] pathForResource:imgMain ofType:@"jpg"];
NSData * imageData = [NSData dataWithContentsOfFile:fileLocation];
UIImage * blurMe = [UIImage imageWithData:imageData];
NSAutoreleasePool * pool = [[NSAutoreleasePool alloc] init];
UIImage * scaledImage = [blurMe _imageScaledToSize:CGSizeMake(blurMe.size.width/dblBlurLevel, blurMe.size.width/dblBlurLevel) interpolationQuality:3.0];
UIImage * labelImage = [scaledImage _imageScaledToSize:blurMe.size interpolationQuality:3.0];
UIImage * imageCopy = [[UIImage alloc] initWithCGImage:labelImage.CGImage];
[pool drain]; // deallocates scaledImage and labelImage
imgView.image = imageCopy;
[imageCopy release];
以下は、ぼかし機能です。私はobjectalloc問題がここにあると信じています。たぶん私はちょうど新鮮な目のペアが必要です。もし誰かがこれを理解できれば素晴らしいだろう。すみません、申し訳ありません...私はそれを試して短縮します。私はそれを考えることができ
@implementation UIImage(Blur)
- (UIImage *)blurredCopy:(int)pixelRadius
{
//VARS
unsigned char *srcData, *destData, *finalData;
CGContextRef context = NULL;
CGColorSpaceRef colorSpace;
void * bitmapData;
int bitmapByteCount;
int bitmapBytesPerRow;
//IMAGE SIZE
size_t pixelsWide = CGImageGetWidth(self.CGImage);
size_t pixelsHigh = CGImageGetHeight(self.CGImage);
bitmapBytesPerRow = (pixelsWide * 4);
bitmapByteCount = (bitmapBytesPerRow * pixelsHigh);
colorSpace = CGColorSpaceCreateDeviceRGB();
if (colorSpace == NULL) { return NULL; }
bitmapData = malloc(bitmapByteCount);
if (bitmapData == NULL) { CGColorSpaceRelease(colorSpace); }
context = CGBitmapContextCreate (bitmapData,
pixelsWide,
pixelsHigh,
8,
bitmapBytesPerRow,
colorSpace,
kCGImageAlphaPremultipliedFirst);
if (context == NULL) { free (bitmapData); }
CGColorSpaceRelease(colorSpace);
free (bitmapData);
if (context == NULL) { return NULL; }
//PREPARE BLUR
size_t width = CGBitmapContextGetWidth(context);
size_t height = CGBitmapContextGetHeight(context);
size_t bpr = CGBitmapContextGetBytesPerRow(context);
size_t bpp = (CGBitmapContextGetBitsPerPixel(context)/8);
CGRect rect = {{0,0},{width,height}};
CGContextDrawImage(context, rect, self.CGImage);
// Now we can get a pointer to the image data associated with the bitmap
// context.
srcData = (unsigned char *)CGBitmapContextGetData (context);
if (srcData != NULL)
{
size_t dataSize = bpr * height;
finalData = malloc(dataSize);
destData = malloc(dataSize);
memcpy(finalData, srcData, dataSize);
memcpy(destData, srcData, dataSize);
int sums[5];
int i, x, y, k;
int gauss_sum=0;
int radius = pixelRadius * 2 + 1;
int *gauss_fact = malloc(radius * sizeof(int));
for (i = 0; i < pixelRadius; i++)
{
.....blah blah blah...
THIS IS JUST LONG CODE THE CREATES INT FIGURES
........blah blah blah......
}
if (gauss_fact) { free(gauss_fact); }
}
size_t bitmapByteCount2 = bpr * height;
//CREATE DATA PROVIDER
CGDataProviderRef dataProvider = CGDataProviderCreateWithData(NULL, srcData, bitmapByteCount2, NULL);
//CREATE IMAGE
CGImageRef cgImage = CGImageCreate(
width,
height,
CGBitmapContextGetBitsPerComponent(context),
CGBitmapContextGetBitsPerPixel(context),
CGBitmapContextGetBytesPerRow(context),
CGBitmapContextGetColorSpace(context),
CGBitmapContextGetBitmapInfo(context),
dataProvider,
NULL,
true,
kCGRenderingIntentDefault
);
//RELEASE INFORMATION
CGDataProviderRelease(dataProvider);
CGContextRelease(context);
if (destData) { free(destData); }
if (finalData) { free(finalData); }
if (srcData) { free(srcData); }
UIImage *retUIImage = [UIImage imageWithCGImage:cgImage];
CGImageRelease(cgImage);
return retUIImage;
}
唯一のものはobjectallocをされるまで保持しているこのUIImage * retUIImage = [UIImage imageWithCGImage:cgImage]; ...しかし、どのように行うに私はそれが返された後、そのリリース?うまくいけば誰かが助けてくれるはずです。
それがリークに関連しています場合、私は考えているが、あなたはコンテキストをリリースしてきた前に、 '(のBitmapData)自由'を呼び出すべきではありません。 'malloc()'で割り当てられたメモリのブロックは保持カウンタを持たないので、 'free()'を呼び出すとCGContextがそれを使っていてもすぐに解放されます。 – benzado
iPhone OS 3.1以降をターゲットに設定していますか?これは、3.0以前のフレームワークのバグかもしれません。 3.1の場合、 'CGBitmapContextCreate'にbitmapDataを割り当てる必要はありません。 また、 '_imageScaledToSize'は文書化されていない呼び出しです。それを使用しないでください。あなたが文書化されていない呼び出しを使用している場合、あなたの質問に答えてくれる人がいないかもしれません。 – lucius
ちょっとbbullis21あなたのぼかしコードは、デバイス上で正常に動作していますか? – Leena