Странные проблемы с памятью на iPad - PullRequest
0 голосов
/ 23 декабря 2010

При запуске инструмента Allocations в любой момент времени моему приложению для iPad выделяется менее 5 МБ памяти. Я был очень тщательным и удостоверился, что все выпущено правильно. Мое приложение представляет собой приложение панели вкладок, которое загружает много изображений, видео и PDF. Я удостоверился, что обработал это должным образом и очистил кеши и т. Д., Чтобы освободить память.

Однако, когда я запускаю инструмент Activity Monitor, когда мое приложение работает на iPad, использование памяти моим приложением постепенно увеличивается и в итоге достигает 100 МБ и вылетает.

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

Помимо распределений, по каким причинам мое приложение потребляет столько памяти? Есть ли другой инструмент, который я могу использовать, чтобы отследить, какие процессы используют память?

Редактировать: Как уже упоминалось, я использовал Build and Analyze, чтобы убедиться, что все проблемы были устранены.

1 Ответ

2 голосов
/ 23 декабря 2010

Часто CGImages и другие большие медиа-объекты не отображаются в Allocations - они могут отображаться как небольшой невинно выглядящий объект, но они указывают на некоторый большой объект, например изображение, которое выделяется с использованием «странных» техник (например, файлы, отображаемые в память, память видеокарты и т. д.). Инструмент мониторинга активности, с другой стороны, просматривает память, используемую в терминах страниц размером 4 КБ, загруженных для вашего приложения, и, таким образом, включает в себя эти медиа-объекты.

Я не знаю, какова ваша схема кеширования. Вот сценарий: Вам нужно загрузить 50 100K JPEG - пользователь увидит только максимум 3 сразу. 50 100К изображений - это 5 МБ памяти. Таким образом, вы можете загрузить все данные для JPEG из Интернета. Если вы затем создадите 50 изображений CGI из этих данных, то каждый из них будет использовать (при условии, что jpegs составляют 1000x1000 * 4 байта на пиксель =) 4 МБ памяти. Так что это будет 200 МБ, чтобы хранить их все в памяти. Который не будет работать. Таким образом, вы должны хранить 100 000 сжатых больших двоичных объектов nsdata, а затем создавать только 1 или 3 изображения CGimage в то время, когда они вам нужны. Это искусство держать вещи гладкими и сбалансированными.

В других рабочих местах: в Allocations - посмотрите количество CGImageRefs и т. Д., Которое у вас есть за один раз, и уменьшите , чем число.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...