iPhone - несколько вызовов CGBitmapContextCreateImage - восхождение на объект ObjectAlloc - PullRequest
0 голосов
/ 17 сентября 2009

Кто-нибудь еще сталкивался с этой проблемой? ObjectAlloc поднимается в результате CGBitmapContextCreateImage. Программное обеспечение Apple не полностью освобождает objectalloc?

Я изменяю размер изображения 12 раз в секунду с помощью NSTimer. Во время изменения размера изображения я также добавляю фотошоп, как эффект размытия по Гауссу, включая interpolationQuality.

После использования инструментов он не показывает утечек памяти, но мой 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];
}

Ответы [ 2 ]

1 голос
/ 17 сентября 2009

Этот код перевыпускает result.

Тем не менее, вероятно, проблема в том, что UIImage не освобождается, а UIImage удерживает CGImage, а CGImage удерживает память, которая была выделена в CGBitmapContextCreate.

Используйте инструменты, чтобы увидеть, не были ли UIImages освобождены, и если да, попробуйте отладить почему.

0 голосов
/ 17 сентября 2009

Я скомпилировал и запустил ваш код так, как он у вас есть, и я не вижу никаких утечек, и при этом мой объект не продолжает расти. Я запускаю код пару раз в секунду и не вижу роста объектов в Инструментах. Я бегу только на симуляторе. Я также попробовал kCGInterpolationNone вместо 3.0 в случае, если это проблема, и все еще нет утечки.

Не уверен, почему я не получаю их, а ты получаешь. Возможно, вы захотите просто сделать это в методе:

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

    return inImage;
...

Чтобы сделать этот метод бессмысленным, а затем посмотрите, продолжает ли расти объект. Если так, то проблема в другом.

...