Таким образом, я установил свое приложение на моем 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:
Таким образом, я просто попробовал вышеупомянутый код и фоновые изображения, и все остальное все еще там, и появляется, как будто ничто на самом деле не становится очищенным. Предложения?
В iPhone нет виртуальной памяти и сборки мусора. Поэтому, как только что-то загружается в память, оно остается в ней до тех пор, пока ваш код явно не освободит его. Если вы не используете какие-то ресурсы, вам обязательно следует очистить их как можно скорее.
Также следует прислушиваться к предупреждениям iOS о низком уровне памяти - это еще одна возможность для вашего кода провести внутреннюю очистку.
Во-первых, лениво загружайте свои ресурсы, если у вас нет оправданной причины не делать этого. Во-вторых, я не знаю, насколько велики ваши изображения, но для больших изображений (тех, которые по своей природе предназначены для таких вещей, как фон, или других), вообще говоря, я буду разбивать их на куски, и загружать их, опять же, как вы догадались, лениво, по мере необходимости.
Что вам следует делать, так это правильно обрабатывать предупреждения о нехватке памяти. Удалите все ресурсы, которые не являются абсолютно критичными - например, элементы других представлений на других вкладках или скрытое содержимое. Вы сможете загрузить их снова, когда это будет необходимо.
Вам также следует посмотреть на использование Instruments, чтобы выяснить, нет ли у вас утечек (я надеюсь, что вы уже сделали это), изучить свою программу, чтобы увидеть, можно ли сохранять некоторые кэшированные ресурсы на диск во время ситуаций с низким уровнем памяти, и т.д.