Как правильно управлять памятью в быстродействующем мультимедийном приложении?Выпустить это? - PullRequest
0 голосов
/ 08 мая 2019

ОБНОВЛЕНИЕ: я исправил утечку памяти.Мне по-прежнему очень любопытно услышать, каковы лучшие рекомендации для приложения, предназначенного для сбора потенциально бесконечного потока данных изображения, чтобы сбалансировать производительность (пользователь видит изображение без задержки загрузки) и использование памяти.Мне также любопытно, может ли кто-нибудь говорить с 1) PFFile - это просто путь, используемый для получения данных в потоке, или каждый элемент PFFile занимает значительное место?2) Чтобы освободить пространство после просмотра изображения, будет ли установка изображения = ноль освободить пространство?

РЕДАКТИРОВАННОЕ ОРИГИНАЛЬНОЕ ПОСТ: есть ли лучшая практика для приложений с большими изображениями (например, Facebook или Instagram), где пользователи могут непрерывно переключаться между изображениями.Я заметил, что использование памяти постоянно увеличивается с использованием моего текущего подхода.

В настоящее время у меня есть класс сервера разбора для «Изображения», где фактическое изображение - это PFFile.Я выбираю * из этого и считываю каждую строку в массив структуры данных клиента, содержащей поля «Изображения», одним из которых является PFFile.Затем я сохраняю переменную «Текущее положение», и каждый раз, когда пользователь нажимает «Далее», я добавляю один, преобразую PFFile в текущей позиции в UIImage, устанавливаю его в элементе массива и обновляю представление изображения (таким образом, когда они нажимают назад, я не надеваюне нужно повторно обрабатывать PFFile. При тестировании моего приложения я быстро увидел скачок использования памяти до 2 ГБ, поскольку просмотр каждого изображения означал, что каждый UIImage был сохранен в массиве. Я определенно думаю, что не могу удержать каждый UIImage, поскольку пользователиможет посмотреть на все изображения, и у меня не хватит памяти.

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

Ответы [ 2 ]

1 голос
/ 08 мая 2019

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

Для вашей общей проблемы вам нужен какой-то способ сохранения изображений в кэш (на диске). Сохранение постоянно растущего массива объектов UIImage будет означать, что ваше приложение будет закрыто. Если вы попробуете протестировать устройство, вы обнаружите, что использование 2 ГБ памяти приведет к завершению работы вашего приложения системой. Для кеширования используйте библиотеку. SDWebImage очень популярен.

Наконец, обратите внимание на систему, сообщающую вам о нехватке памяти с UIViewController s didReceiveMemoryWarning и уведомлением UIApplicationDidReceiveMemoryWarningNotification. Когда вы получите одно из этих уведомлений, отпустите некоторые изображения. То, как вы должны это сделать, является сложным и зависит от вашего собственного кода.

1 голос
/ 08 мая 2019

Вы можете попробовать поиграть с @AUTORELEASEPOOL. Здесь хорошая статья Вэй Вана об этом.

Надеюсь, это поможет.

...