Мой графический интерфейс для приложения iPhone использует многочисленные UIViews. Пользователь «переворачивается» через эти представления, когда они нажимают кнопку, чтобы идти вперед или назад. Представления хранятся вне экрана и добавляются в фактическое представление только тогда, когда программа должна отображать его.UIViews, связанные с утечками памяти
В процессе флип программа сообщает родительскому представлению (uiscrollview) для удаления любого существующего subview с помощью метода removeFromSuperView, а затем добавляет новый подвью, который является новой страницей, которую должен видеть пользователь.
Однако после нескольких повторений этого процесса на устройстве программа вылетает с статусом 101 выхода gdb, который, как я нашел, вызван ошибкой вне памяти.
Я попытался диагностировать эту проблему с помощью инструмента «Утечки», но безрезультатно. Существует только 1 или 2 небольших утечек памяти, а общее использование памяти на устройстве программой составляет всего 2,5 мб. Возможно ли, что видеопамять, а не системная память, работает на низком уровне?
Я наткнулся на this сообщение, касающееся использования цвета и памяти, но мне нужно дополнительное объяснение. Должен ли я уменьшить настройку backgroundColor, чтобы предотвратить CALayer UIView от слишком большого объема памяти?
Да, я использую NSArray для хранения этих представлений вне экрана. В общем, они не занимают столько памяти, но проблема с памятью возникает после того, как я периодически добавляю и удаляю UIViews из основного ScrollView. Еще одна вещь, которую следует отметить, заключается в том, что если я перехожу назад и вперед между 2-3 экземплярами одного экземпляра, ничего не происходит, и все работает нормально. Однако, если я перехожу через 10 или более просмотров, программа выйдет из строя. Похоже, я почти справился с этой проблемой. – obsoleteModel81
Трудно сказать, не зная точно, что вы делаете. Итак, две вещи: 1. Добавьте код, показывающий, что вы делаете в своем вопросе, поэтому мы можем вам помочь. 2. Мое предположение заключается в том, что вы добавляете представления по запросу в эту область, и, когда вы просматриваете более «уникальные» виды (т. Е. Те, которые вы не видели раньше), вы используете все больше и больше памяти. Попробуйте следующее: в том же месте вы вызываете removeFromSuperview, также вызываете '[yourArray removeObject: view];'. Если это решает вашу проблему, то мы знаем, в чем проблема, и можем придумать чистое/подходящее решение. – Itay
Кажется, что удаление представления из кеша после его отображения предотвратило возникновение проблемы с памятью. Во-первых, важно отметить, что все представления были инициализированы до любого рендеринга. Однако, хотя проблема с памятью больше не возникает, поскольку просмотры освобождаются после ее удаления из прокрутки, программа больше не имеет возможности листать назад.(Он может только продвигаться вперед) Инициализация компонентов в режиме реального времени - лучший вариант здесь, или есть альтернативное решение? – obsoleteModel81