MFMailComposeViewController использует слишком много памяти

#objective-c #memory-leaks #mfmailcomposeviewcontroller

#objective-c #утечки памяти #mfmailcomposeviewcontroller

Вопрос:

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

Ответ №1:

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

Изображения, такие как 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 МБ одновременно, то так и должно быть.