2009-09-17 5 views
0

Есть ли у кого-нибудь еще такая проблема? ObjectAlloc поднимается в результате CGBitmapContextCreateImage. Программное обеспечение Apple не полностью освобождает объект allococ?iPhone - Несколько вызовов CGBitmapContextCreateImage - ObjectAlloc climbing

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

После использования инструментов он не обнаруживает утечек памяти, но мой объектalloc просто продолжает подниматься. Он указывает прямо на CGBitmapContextCreateImage.
CGBitmapContextCreateImage> create_ bitmap_ data_provide> таНос

Любое знает решение? или даже возможные идеи?

Зов в 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]; 
} 
+0

Вы уверены, что CGContextSetInterpolationQuality делает гауссовское размытие? – mahboudz

+0

Можете ли вы показать, как вы называете этот метод и что вы делаете с возвращенным изображением? – coneybeare

+0

Да, способ, которым я пользуюсь этой функцией, отлично подходит для получения фотошопа, такого как Gaussian Blur. Я передаю нормальный UIImage в этот скрипт и изменяю размер изображения до очень небольшого размера и добавляю к нему некоторый InterpolationQuality. Это делает новое очень маленькое изображение размытым. Затем я снова вызываю сценарий изменения размера и передаю его в сжатое и размытое изображение, которое я только что создал. Когда вы увеличиваете небольшое размытое изображение, оно возвращается с идеальным размытием Gaussian. Я искал все, чтобы найти простой способ добавить гауссовское размытие, но я не нашел функционала, который добавляет его так хорошо, как это. – bbullis21

ответ

1

Этот код overreleases result.

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

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

+0

Чтобы убедиться, что я не завышаю результат, могу ли я просто заменить .... return [result autorelease] с результатом возврата; .... если это так, то это тоже не исправляет. У моего исходного кода это было так, кто-то дал совет добавить авторекламу.Этот CGBitmapContextCreateImage> create_bitmap_data_provide> malloc, сводит меня с ума. – bbullis21

+0

Перегрузка не проблема, это что-то еще, что неправильно. Это остальное, что касается моего комментария. Проверьте, не утечка UIImages. – Ken

+0

Вы проверяете это, выбрав «Созданный и неподвижный» в программе «Инструменты»? Извините, только кодировался уже 2 месяца, поэтому я все еще учусь – bbullis21

-1

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

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

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

    return inImage; 
... 

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

+0

Я дал эту попытку и все тот же результат. Создание ObjectAlloc по-прежнему указывает на вызов CGBitmapContextCreateImage. Спасибо хоть. Третий день подряд я вытягивал свои волосы из-за этого. – bbullis21

+0

Попробуйте это: вместо предоставления NULL в CGBitmapCreateContext, передайте его bmapPtr = malloc (высота * 4 * thumbRect.size.width); Не забудьте освободить (bmapPtr) в конце метода. – mahboudz

+0

bmapPtr a int? Я не уверен, что объявить это? – bbullis21