UIImageView не освобождава памет (според VM Tracker) - Предупреждения за недостатъчна памет и прекратяване

Наистина се боря с липсата на памет в приложението си. Това са основните операции, които извършвам, както е посочено по-долу. Обърнете внимание, че всеки път, когато потребител направи снимка с камерата, запазвам две различни нейни версии – едната е визуализация (за бързо зареждане) и една с високо качество за мащабиране и маркиране по-късно.

Ето списък с моя ред на операции:

  1. При стартиране на приложението покажете миниатюри на изображения, които са направени в приложението (очевидно при първото стартиране на приложението този списък е празен).
  2. Докоснете бутона на камерата, за да стартирате UIImagePickerController
  3. Потребителят прави снимка и я запазва (отново се запазва визуализация и се запазва снимка в пълен мащаб)
  4. Списъкът с миниатюри се обновява и показва новото изображение за визуализация. Отново, общият размер на „Image IO“ в инструмента VM Tracker все още е много малък (увеличен с може би 0,5 MB отгоре).
  5. User touches one of the preview images, which launches a different view controller that does the following:
    • Create new UIImageView, load the image, add as a subview to View Controllers view
    • Изведнъж „Image IO“ скача с 30MB.

Това не би било голяма работа, но когато се върна назад (навигационният контролер изскача), нито типът „Image IO“, нито типът „Dirty“ намаляват по размер. Сякаш UIImageView не се унищожава. Всеки път, когато натисна този контролер за изглед и заредя изображение, размерът се увеличава с 30MB и изскачането никога не го намалява.

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

Само за информация, настройките, които използвам за запазване на визуализацията и пълното изображение, са:

Визуализация: [UIImageJPEGRepresentation([UIImage imageWithImage:image scaledToSize:CGSizeMake(300, 400)], 0.4f) writeToFile:previewPath atomically:NO];

Пълно: [UIImageJPEGRepresentation(image , 0.8f) writeToFile:imagePath atomically:NO];

Основната ми грижа е (1) да разбера как да се отърва от паметта, използвана от UIImage, след като извадя съдържащия контролер за изглед, но също така бих искал да знам (2) защо изображението е 30MB, когато е заредено.


person thephatp    schedule 16.07.2013    source източник
comment
(1) Вече съм виждал подобен проблем с изгледа на изображението, опитайте да зададете изображението му на нула, преди да отворите контролера, и вижте дали проблемът продължава. (2) Зависи от размера на изображението, но некомпресираното изображение може да заеме много място (4000x2000) ще заеме 32MB. Ако това е проблемът, трябва да погледнете малко за подреждането (мисля, че дори беше описано в WWDC)   -  person Matic Oblak    schedule 16.07.2013
comment
@MaticOblak, добри препоръки. За (1) се опитах да настроя изгледа, който съдържа изгледа на изображението, на нула и това не проработи, но имате добра гледна точка. Бих могъл да опитам да създам променлива на екземпляр както за UIImageView, така и за UIImage и да задам и двете на нула (разбира се първо UIImage), преди да изскоча и да видя дали това работи. За (2) благодаря за информацията - определено ще я потърся. :)   -  person thephatp    schedule 16.07.2013
comment
@MaticOblak, номер 1 проработи! Изрично зададох UIImage И UIImageView на нула (не съм сигурен дали и двете са необходими) и разбира се, това освободи паметта. Ако публикувате това като отговор, ще го маркирам като прието решение! Благодаря!!   -  person thephatp    schedule 16.07.2013


Отговори (2)


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

не зареждайте изображения с [UIImage imageNamed:] за зареждане на изображение в ImageView, това причинява проблем с паметта, когато броят на изображенията е повече,

използвай това,

 NSString * imgpath= [ [ NSBundle mainBundle] pathForResource:@"imageName" ofType:@"png"];

 ImageView.image=[UIImage imageWithContentsOfFile: imgpath];
person hmdeep    schedule 17.04.2014

Както беше предложено от @Matic Oblak...

(1) Вече съм виждал подобен проблем с изглед на изображение, опитайте да зададете изображението му на „нула“, преди да отворите контролера и вижте дали проблемът продължава.

РЕЗУЛТАТ: Изрично зададох UIImage И UIImageView на нула (не съм сигурен дали и двете са необходими) и разбира се, това освободи паметта.

person thephatp    schedule 02.08.2013