UIImage, причиняващ изтичане на памет

Instruments ми казва, че се разпределя много памет, когато бързо задам името на изображението на UIImageview в моето приложение. Имам UIImageView, който променя името на изображението си всеки кадър в моята игра. Когато се профилира с инструменти за проверка на зомбита, приложението изглежда постоянно набира живи байтове с огромна скорост. Има ли начин, по който мога да освободя текущото изображение на UIImageView, за да го спра да прави това? Използвам ARC.

Моят код за присвояване на изображението на UIImageView е както следва:

aPlanet.image = [UIImage imageNamed:tempPlanetName];

Където aPlanet е UIImageView, а tempPlanetName е името на изображението. Това се нарича всеки кадър.


person Fitzy    schedule 04.01.2013    source източник
comment
напишете вашия код за това как присвоявате изображение на вашия изглед на изображение   -  person P.J    schedule 04.01.2013
comment
Трябва да правите нещо толкова нелепо в @autoreleasepool блок. Или използвайте нещо много по-леко като CALayer, по този начин не разпределяте два обекта само за показване на изображение веднъж на всеки кадър.   -  person CodaFi    schedule 04.01.2013
comment
Освен това iOS ще кешира вашите изображения, ако използвате imageNamed, така че внимавайте с това.   -  person borrrden    schedule 04.01.2013
comment
публикувайте вашия код!! не можем да познаем какво правиш!   -  person DD_    schedule 04.01.2013
comment
Кодът, който използвам, сега е показан във въпроса. @borrrden какво имаш предвид под „кеш“?   -  person Fitzy    schedule 04.01.2013


Отговори (2)


Когато използвате UIImage imageNamed:, той ще зареди и кешира този файл с изображение. Това е предназначено за повторно използване на икони и други ресурси за изображения, които ще бъдат използвани повече от веднъж във вашето приложение.

Освен че изглежда малко необичайно да актуализирате изглед на изображение с ново изображение на всеки кадър, трябва да потърсите алтернативни начини за зареждане на изображения, които няма да ви трябват повече от веднъж - или дори да ви трябват, когато имате нужда от повече контрол върху неговия жизнен цикъл .

Например погледнете UIImage imageWithContentsOfFile: (документирано тук: Справочник на библиотеката за разработчици на Apple). Изрично се посочва, че този метод няма да извършва никакво кеширане на съдържанието на изображението.

Надявам се това да ви помогне, но за всеки кадър се съмнявам, че представянето ви ще бъде достатъчно добро с този подход, но това вероятно е тема на друг въпрос, ако възникне нужда.

person Daniel Schneller    schedule 04.01.2013
comment
Използването на метода UIImage imageWithContentsOfFile: използва много повече памет от метода UIImage imageNamed:. Докато разбирам откъде идвате, изглежда има проблем, при който извикването на метода разпределя памет, но след това не се освобождава. Тук съм най-объркана. - person Fitzy; 04.01.2013
comment
Използвате ли ARC? Ако не, ще трябва сами да освободите екземпляра на изображението, за да освободите отново паметта. - person Daniel Schneller; 04.01.2013
comment
Да, използвам ARC. Но по някаква причина паметта просто не се освобождава. - person Fitzy; 04.01.2013

Методът [UIImage ImageNamed:] зарежда изображението в изглед на изображение и добавя този новосъздаден uiimage обект към пула за автоматично освобождаване. За да се отървете от този проблем, трябва да използвате -

NSString *imgPath = [NSBundle mainbundle] pathForResource:@"imageName" ofType:@"png"]; aPlanet.image = [[UIImage alloc] ]initWithContentsOfFile:imgPath];

ако използвате arc, тогава не е нужно да се притеснявате за освобождаването на този новоразпределен обект на uiimage, който е създаден с помощта на initWithContentsOfFile: метод.

person Pankaj Yadav    schedule 04.01.2013