2009-09-14 5 views
0

Я провел исследование и несколько раз пытался освободить память UIImage и не увенчался успехом. Я видел еще одно сообщение в Интернете, где у кого-то была такая же проблема. Каждый раз, когда вызывается imageScaledToSize, ObjectAlloc продолжает расти.iPhone - UIImage imageScaledToSize Memory Issue

В следующем коде я вытаскиваю локальное изображение из каталога ресурсов и изменяю его размер с некоторым размытием. Может ли кто-нибудь помочь в том, как выпустить память UIImages, называемую ... scaledImage и labelImage. Это кусок кода, где iPhone Intruments показал, что ObjectAlloc создается. Этот фрагмент кода вызывается несколько раз с помощью NSTimer.

//Get local image from inside resource 
NSString * fileLocation = [[NSBundle mainBundle] pathForResource:imgMain ofType:@"jpg"]; 
    NSData * imageData = [NSData dataWithContentsOfFile:fileLocation]; 
    UIImage * blurMe = [UIImage imageWithData:imageData]; 

//Resize and blur image 
    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]; 
    imgView.image = labelImage; 
+0

Есть ли у кого-нибудь еще одно возможное решение? Мой объект allococ все еще поднимается в результате вызова imageScaledToSize – bbullis21

ответ

0

Вы можете обернуть вызовы в качестве NSAutoreleasePool, где будет объединенными их результаты. Затем вы можете вызвать [pool drain] в этом пуле, и его содержимое будет выпущено, включая изображения.

Однако обратите внимание, что вы не сможете использовать изображения за пределами сферы действия NSAutoreleasePool, так что вы код могли бы хотеть выглядеть примерно так:

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]; // Gives a non-autoreleased copy of labelImage 

[pool drain]; // deallocates scaledImage and labelImage 

imgView.image = imageCopy; // retains imageCopy 

UPDATE:

Если указанные выше все еще дает вам проблемы, см. решение, которое я разместил до this question. Вопрос заключается в повороте изображения на 90 градусов вместо масштабирования, но предпосылка одинаков (это просто преобразование матрицы, которое отличается). Использование кода, как в ответе, которое я опубликовал, должно дать вам больший контроль над вашим управлением памятью и отвести вас от использования недокументированных API, таких как _imageScaledToSize.

+0

Возможно, у вас есть небольшой пример? Я никогда не работал с NSAutoreleasePool до – bbullis21

+0

Это может быть немой вопрос, но если я не смогу использовать изображения за пределами пула NSAutorelease, как я смогу использовать imageCopy в вашем примере? – bbullis21

+0

(я обновил пример, чтобы попытаться быть немного более понятным.) 'ImageCopy' не помещается в пул авторесурсов и потребует вашего кода для управления памятью, что вам нужно, потому что вы используете его в' imgView', который будет длиться дольше, чем пул авторезистов. Изображения, которые находятся в пуле авторасчетов - labelImage и scaledImage - вы не ссылаетесь после того, как пул слит, так что вы в порядке. – fbrereto