2009-08-14 2 views
1

Мой графический интерфейс для приложения iPhone использует многочисленные UIViews. Пользователь «переворачивается» через эти представления, когда они нажимают кнопку, чтобы идти вперед или назад. Представления хранятся вне экрана и добавляются в фактическое представление только тогда, когда программа должна отображать его.UIViews, связанные с утечками памяти

В процессе флип программа сообщает родительскому представлению (uiscrollview) для удаления любого существующего subview с помощью метода removeFromSuperView, а затем добавляет новый подвью, который является новой страницей, которую должен видеть пользователь.

Однако после нескольких повторений этого процесса на устройстве программа вылетает с статусом 101 выхода gdb, который, как я нашел, вызван ошибкой вне памяти.

Я попытался диагностировать эту проблему с помощью инструмента «Утечки», но безрезультатно. Существует только 1 или 2 небольших утечек памяти, а общее использование памяти на устройстве программой составляет всего 2,5 мб. Возможно ли, что видеопамять, а не системная память, работает на низком уровне?

Я наткнулся на this сообщение, касающееся использования цвета и памяти, но мне нужно дополнительное объяснение. Должен ли я уменьшить настройку backgroundColor, чтобы предотвратить CALayer UIView от слишком большого объема памяти?

ответ

0

Где вы храните все эти мнения? В частности, у вас есть некоторый массив (NSArray), который имеет эти представления, когда вы просматриваете их?

Представления не будут освобождены, если их счетчик ссылок не достигнет нуля. Ваш `[[UIView alloc] init] делает счетчик ссылок равным 1, добавляя его как subview, делает его 2, и удаление его из подвью делает его еще 1. Видя, как вам не рассказывают о какой-то конкретной утечке, кажется, что вы действительно не просачиваетесь так же, как ее где-то хранить.

+0

Да, я использую NSArray для хранения этих представлений вне экрана. В общем, они не занимают столько памяти, но проблема с памятью возникает после того, как я периодически добавляю и удаляю UIViews из основного ScrollView. Еще одна вещь, которую следует отметить, заключается в том, что если я перехожу назад и вперед между 2-3 экземплярами одного экземпляра, ничего не происходит, и все работает нормально. Однако, если я перехожу через 10 или более просмотров, программа выйдет из строя. Похоже, я почти справился с этой проблемой. – obsoleteModel81

+0

Трудно сказать, не зная точно, что вы делаете. Итак, две вещи: 1. Добавьте код, показывающий, что вы делаете в своем вопросе, поэтому мы можем вам помочь. 2. Мое предположение заключается в том, что вы добавляете представления по запросу в эту область, и, когда вы просматриваете более «уникальные» виды (т. Е. Те, которые вы не видели раньше), вы используете все больше и больше памяти. Попробуйте следующее: в том же месте вы вызываете removeFromSuperview, также вызываете '[yourArray removeObject: view];'. Если это решает вашу проблему, то мы знаем, в чем проблема, и можем придумать чистое/подходящее решение. – Itay

+0

Кажется, что удаление представления из кеша после его отображения предотвратило возникновение проблемы с памятью. Во-первых, важно отметить, что все представления были инициализированы до любого рендеринга. Однако, хотя проблема с памятью больше не возникает, поскольку просмотры освобождаются после ее удаления из прокрутки, программа больше не имеет возможности листать назад.(Он может только продвигаться вперед) Инициализация компонентов в режиме реального времени - лучший вариант здесь, или есть альтернативное решение? – obsoleteModel81

1

У вас есть доступ к образцу кода iphone для apple? Похоже, что программа SampleControl Sample Code является хорошим примером того, что вы ищете. А в примерах программ кода нет утечек памяти или какой-либо такой проблемы :) Ссылка here

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

+0

Kiyoshi определенно имеет правильную идею и правильную ссылку. О методах, о которых я говорю, упоминается в образце PageControl, но они не завершены - вам все равно придется удалять неиспользуемые subviews. – Itay

Смежные вопросы