removeFromSuperView / memory / динамическое переключение просмотра

Я реализовал большой список представлений в UIScrollView. Я не могу использовать табличное представление из-за характера моего приложения.

В основном у меня есть набор «блоков», которые являются самими контроллерами представления, внутри UIScrollView. Все работает нормально, но на очень больших страницах проблема с памятью. Я успешно реализовал динамическое добавление подвидов (когда они появляются на экране, они размещаются и добавляются в родительский вид). Сами блоки настраиваются и создаются сразу, но их фактические представления, то есть block.view, не добавляются в большой контейнер, пока они не появятся на экране. Это отлично работает, но мне нужен способ удаления представлений из памяти, когда они уходят за пределы экрана. removeFromSuperView заставляет их исчезнуть, но не уменьшает использование памяти.

Если я немедленно удаляюFromSuperView, после addSubview блок не отображается, и память не увеличивается. Если я удаляюFromSuperview после цикла отрисовки, память увеличивается при отрисовке и не возвращается обратно, даже если вы больше не можете видеть представление. Это похоже на то, что представление кешируется, пока я действительно не выпущу все представление. Это не имеет смысла, потому что он не использовал много памяти до его рисования, даже если он был создан.

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

Например, если я сохраню вместо addSubview, я знаю, что мое представление все еще существует, но оно не использует почти столько памяти.

Я пробовал вызвать предупреждение о памяти на vc


person Sam    schedule 22.07.2009    source источник


Ответы (1)


Я считаю, что UIViews разумно не выделяет слой для себя, пока он не отобразится. Вот почему вы не видите увеличения использования памяти, пока не добавите его в супервизор.

Что вам следует сделать, так это не создавать представление, пока оно не понадобится, и отпустить его, как только оно будет удалено из представления прокрутки. Таким образом слой будет освобожден.

По сути, вы захотите реализовать loadView, чтобы создавать (и воссоздавать) представление всякий раз, когда к нему обращаются через свойство view.

person Daniel Dickison    schedule 22.07.2009