iPhone - UIImage imageScaledToSize Проблема с памятью - PullRequest
0 голосов
/ 15 сентября 2009

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

В следующем коде я извлекаю локальное изображение из своего каталога ресурсов и изменяю его размер с некоторой размытостью. Может ли кто-нибудь помочь с освобождением памяти 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;

1 Ответ

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

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

Обратите внимание, что вы не сможете использовать изображения вне области 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:

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

...