MFMailComposeViewController использует слишком много памяти - PullRequest
1 голос
/ 26 апреля 2011

Когда я пытаюсь отправить изображения в виде вложений (суммарный размер ~ 4 МБ) с помощью MFMailCompose, монитор активности сообщает, что используется 100 (+ - 2) МБ памяти. После отправки или отмены памяти освобождается ~ 20 мегабайт, но что случилось с оставшимися 80 мегабайтами, если общий элемент с изображениями был освобожден? Спасибо!)

1 Ответ

4 голосов
/ 27 апреля 2011

Размер файла изображения и объем памяти, который он потребляет при отображении, это две совершенно разные вещи.

Изображения, такие как JPEG и PNG, сжимаются.Когда они выводятся на экран, они не сжимаются.

Быстрое эмпирическое правило, позволяющее выяснить, сколько памяти будет занимать изображение при отображении:

memory consumed = (width * height) * 4

Пример изображения, которое2 КБ на диске, но 62 x 52 пикселя на самом деле потребляют 12 896 байт или 12 КБЯ полагаю, что образ, занимающий 4 МБ на диске, будет занимать намного больше, чем 4 МБ.

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

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

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

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

Ни один корпус не идеален - и это относится и к Apple.В прошлом были документированные случаи, когда фреймворки Apple показывали утечки памяти (кеширование UIImage просочилось в iOS 2.x), но я бы не стал так быстро обвинять фреймворки, когда вы заметите всплеск потребления памяти,Если инструмент утечек не показывает утечек, а анализатор не показывает никаких проблем, наиболее вероятным сценарием является то, что это просто потребление памяти, а не утечка.

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

...