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