Изображение Вопрос для iPad - Проблемы с памятью - PullRequest
1 голос
/ 30 июля 2010

Итак, я установил свое приложение на iPad, и оно зависло из-за проблемы с памятью.Я подумал, что это потому, что я использую действительно большие файлы изображений, поэтому я вернулся и уменьшил их все и, по сути, вырезал около 75% их размера, изменив их размер, а затем используя PNGCrush.

Теперь, что касается запуска программы, если у меня будет фоновое изображение для каждой из моих 4-х отдельных вкладок, сэкономит ли она память, если я установлю изображения на Null каждый раз, когда я переключаю вкладки, или я должен оставитьих установить?У меня есть одна страница, на которой есть пара дюжин изображений, поскольку они действуют как кнопки, и из того, что я слышу, звучит так, как будто я должен очистить их все, когда я не просматриваю эту страницу.Это правильно?

Прямо сейчас, когда я загружаюсь, я загружаю все образы для всего в приложении в своего рода менталитете: «загрузи это сейчас и покончим с этим», хотя из того, что яЯ читал, что вызывает проблемы с памятью, так как не так много памяти для использования.Означает ли это, что каждый раз, когда я переключаю вкладки или представления, я хочу очистить все изображения от невидимых, а затем перезагрузить их, когда мы вернемся к ним?Это приведет к увеличению производительности?Или хотя бы предотвратить сбои?Моя программа работает в симуляторе, но когда я запускаю ее на своем iPad, она просто взрывается = /

Спасибо!

РЕДАКТИРОВАТЬ: я использую Monotouch BTW, следовательно, все в C #

UIImage BG = UIImage.FromFile("Images/Makes/explosion.png");
UIImage basic = UIImage.FromFile("Images/Models/camaro.png");
UIImage advance = UIImage.FromFile("Images/search.png");

AdvancedSearchButton.SetBackgroundImage(advance, UIControlState.Normal);
ImageSearchButton.SetBackgroundImage(basic, UIControlState.Normal);
MainBG.Image = BG;

BG.Dispose();
basic.Dispose();
advance.Dispose();

Теперь я знаю, что в обычном C # dispose() на самом деле не «освобождает» память, но я читал что-то, что говорит, что он преобразуется в "release", когда он компилируется в obj-c, так что это по существуосвободить эти объекты.

Кроме того, мне интересно, понадобится ли мне dispose() отдельных кнопок и изображения после того, как я перестану их просматривать.Я просто устанавливал для изображения значение NULL, но это приводило к ошибкам.

MainBG.Dispose();
AdvancedSearchButton.Dispose();
ImageSearchButton.Dispose();

Большое спасибо за помощь!

EDIT2:

Так что я просто попробовал вышеописанноекод, фоновые изображения и все остальное все еще там и выглядит так, как будто ничего не очищается.Предложения?

Ответы [ 2 ]

2 голосов
/ 30 июля 2010

В iPhone нет виртуальной памяти и нет сборки мусора. Поэтому, когда что-то загружается в память, оно остается в памяти, пока ваш код явно не освободит это. Если вы не используете какие-либо ресурсы, вы должны обязательно очистить их как можно скорее.

Кроме того, вы должны слушать предупреждения о нехватке памяти в iOS, что является еще одной возможностью для вашего кода выполнить внутреннюю очистку.

0 голосов
/ 30 июля 2010

Во-первых, лениво загружайте свои ресурсы, если у вас нет уважительной причины не делать этого.Во-вторых, я не уверен, насколько велики ваши изображения, но на больших изображениях (которые по своей природе предназначены для таких вещей, как фоны или иные), вообще говоря, я буду нарезать их на куски и загружать их, сноваугадал, лениво, как они нужны.

Что вы должны сделать, это правильно обрабатывать предупреждения памяти.Освободите любые ресурсы, которые не являются абсолютно критическими, то есть элементы других представлений на других вкладках или скрытый контент.Вы можете загрузить их снова, когда вам нужно.

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

...