Управление памятью iPhone, что делает мое приложение защищенным от взлома для нескольких устройств

Я разрабатываю приложение, которое использует UIScrollView, чтобы показать список изображений на основе критериев поиска. Используя кнопку, пользователь может загрузить больше изображений.

При тестировании на iPhone 4 ViewController получает предупреждение о памяти в ~750 изображений. При тестировании на iPod 2-го поколения предупреждение о памяти получено при ~150 изображениях.

Насколько я понимаю, когда вызывается didReceiveMemoryWarning, можно освободить память, освободив объекты, но восстановление из нехватки памяти не гарантируется.

Я реализовал didReceiveMemoryWarning и выпустил практически все объекты. В приборах я вижу снижение использования памяти до ~3 МБ. Когда iPod достигает предела памяти в первый раз, все идет хорошо, память освобождается, и приложение возобновляет нормальную работу. Однако во второй раз, когда вызывается didReceiveMemoryWarning, я вижу выпущенные объекты, но приложение все равно падает.

Итак, как мне сделать приложение защищенным от сбоев? Я хочу убедиться, что все устройства, на которых работает приложение, могут загружать столько изображений, сколько позволяет память, но я также хочу убедиться, что приложение не падает.

Я бы предпочел, чтобы приложение никогда не доходило до didReceiveMemoryWarning и устанавливало ограничение на количество отображаемых изображений, но как определить, сколько изображений должно загружать каждое возможное устройство?

Кроме того, размер изображений не гарантируется. Во время тестирования я прихожу к этому произвольному числу 150 на iPod, но что если изображения на сервере в какой-то момент времени будут в два раза больше? Тогда приложение, вероятно, зависнет на 75 изображениях.

Любые предложения?

2 ответа

Решение

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

Это так же, как работает приложение для фотографий, как UITableView реализовано. В основном это сводится к этому:

У вас есть основное прокручиваемое изображение, а внутри него отдельные ячейки. Эти ячейки представляют собой небольшие представления, которые добавляются в качестве подпредставлений к вашему представлению прокрутки с определенными смещениями. Затем вы добавляете свои изображения в эти ячейки.

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

Кроме того, чтобы осуществить эту переработку ячеек, вам нужно увидеть, какие ячейки видны на экране. Если одна или несколько ячеек исчезают с экрана, вы добавляете их в переработанные ячейки. NSSet который ты создаешь. Этот набор просто содержит ячейки для последующей переработки. Есть пример кода Apple, который демонстрирует это, и он называется PhotoScroller. Это также продемонстрировано в видео WWDC10, сессия 104. Я предлагаю вам посмотреть его. Не обращайте внимания на части, касающиеся черепицы, вам не нужно знать это для ваших целей.

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

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

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

Другие вопросы по тегам