Вопрос об изображении для iPad - Проблемы памяти

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

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

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

Спасибо!

Править: Я использую Моносенсорный 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() на самом деле "не освобождает" память, но я считал что-то, что говорит, что она преобразовывается в a "release" когда это компилирует в obj-c так, чтобы по существу освободил бы те объекты.

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

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

Большое спасибо за справку!

EDIT2:

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

1
задан Adam 30 July 2010 в 18:06
поделиться

2 ответа

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

Также следует прислушиваться к предупреждениям iOS о низком уровне памяти - это еще одна возможность для вашего кода провести внутреннюю очистку.

2
ответ дан 2 September 2019 в 22:36
поделиться

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

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

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

0
ответ дан 2 September 2019 в 22:36
поделиться
Другие вопросы по тегам:

Похожие вопросы: