Загрузка новых изображений в UIImageView, память из предыдущих изображений не освобождается - PullRequest
4 голосов
/ 11 июля 2009

У моего приложения есть три UIImageViews. Имеется около 150 изображений в виде файлов ресурсов, каждое .jpg размером около 24К. Приложение покажет все изображения, но только три одновременно.

Но каждый раз, когда я нажимаю кнопку, чтобы загрузить еще три изображения в UIImageViews, столбец «Общие байты» в приборах увеличивается примерно на 700 КБ, пока в итоге не появится предупреждение о нехватке памяти, а затем приложение вылетает. Почему-то память, которую я использую для каждой загрузки трех изображений, не высвобождается.

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

Я пробовал это: (Этот код является частью действия для загрузки еще трех изображений. Три ImageViews это imgShownLeft, imgShownMiddle и imgShownRight. Это переменные экземпляра. Сначала я должен поставить currentImage во всех трех UIImageViews, а затем поместите previousImage в левую и nextImage в правую:

NSString *strImageToSet = [[imgNamesArray objectAtIndex:currentImage] stringByAppendingFormat:@".jpg"];
UIImage *img = [UIImage imageNamed:strImageToSet];
[imgShownMiddle setImage:img];
[imgShownLeft setImage:img];
[imgShownRight setImage:img];

NSString *strPreviousImage = [[imgNamesArray objectAtIndex:previousImage] stringByAppendingFormat:@".jpg"];
img = [UIImage imageNamed:strPreviousImage];
[imgShownLeft setImage:img];

NSString *strNextImage = [[imgNamesArray objectAtIndex:nextImage] stringByAppendingFormat:@".jpg"];
img = [UIImage imageNamed:strNextImage];
[imgShownRight setImage:img];

Тогда я попробовал это: вместо:

    UIImage *img = [UIImage imageNamed:strImageToSet];

Я использовал:

    UIImage *img = [[UIImage alloc] initWithContentsOfFile:strImageToSet];

и присваивает img UIImageViews таким же образом, после чего следует [img release];

Тогда я попробовал:

    UIImage *img = [[[UIImage alloc] initWithContentsOfFile:strImageToSet] autorelease];

Тогда я попробовал:

    img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]];

Но в каждом случае требования к памяти росли с каждым запуском этого действия.

Я знаю, что можно одновременно загружать три изображения, не сохраняя 150 изображений в памяти! Что я делаю не так?

Спасибо за понимание. / SD

1 Ответ

0 голосов
/ 11 июля 2009

Я думаю, что вы хотите использовать

img = [UIImage imageWithContentsOfFile:[[NSBundle mainBundle] pathForResource:[imgNamesArray objectAtIndex:currentImage] ofType:@"jpg"]];

чтобы выполнить загрузку (потому что UIImage imageNamed: предположительно выполняет кэширование, которое вам не нужно), а затем добавьте

[img release];

после каждого setImage вызова, потому что подпредставления должны retain -изображать изображения, поэтому вы пропускаете счетчик ссылок.

Я бы подумал, что вторая версия с autorelease будет работать правильно, но, честно говоря, правила управления памятью Какао все же могут сбить меня с толку, даже когда я почти уверен, что знаю, что делаю.

...