У меня есть приложение для киоска, которое, по сути, показывает кучу слайдов с различной информацией.Сначала я начал писать код более года назад, когда начинал разработку Objective-C и iOS.Я обнаружил, что мой стиль кода теперь намного чище, чем был, и я гораздо опытнее, поэтому я решил переписать его с нуля.
Я запустил свое приложение с инструментом Allocations, чтобы посмотреть, как использовалась память.Учитывая, что это приложение для киосков, все должно работать без сбоев.(Конечно, все приложения должны работать без утечек, но приложение киоска делает это еще более важной целью.) Я увидел некоторые интересные результаты, поэтому я также запустил старую версию кода.
Запускболее старая версия кода, я вижу, даже работает на 1,15 мегабайта памяти.Кажется, все распределяется и освобождается по мере необходимости.Однако в моей новой реализации я вижу что-то немного другое.Использование памяти постоянно растет в небольших «плато», а затем, в конечном итоге, достигает пика в 1,47 мегабайта.Вот как выглядит новый отчет Allocations после более 10 часов работы:
Я обеспокоен по нескольким причинам.
- Нечетный шаблон в начале цикла.
- Распределение кажется, что достигает пика в 1,47 мегабайта, но его запуск в одночасье показывает, что он на самом деле будет медленновсе больше и больше памяти со временем.Это не может быть хорошей вещью.
Есть несколько заметных различий между старым проектом и новым.
Более старый использует Plists в качестве резервного хранилища (я вручную читаю и записываю в файл plist.) Новый проект использует Core Data.
В новом проекте реализована библиотека, которая вызывается на каждом «слайде», которого у старого проекта не было.Я был бы более обеспокоен этой библиотекой, за исключением того, что я написал ее, и я прошел ее, чтобы убедиться, что я выпускаю все и только автоматически выпущен, где ручные выпуски были невозможны.
Оба класса используютфабричный класс для создания слайдов.В старом проекте заводской класс был синглтон.Я думал, что превращение этого в нормальный класс поможет с проблемами памяти, так как синглтон никогда не выпускался.(Следовательно, это свойства не были выпущены. В новом проекте выпускается фабричный класс, поэтому я не уверен, почему он все еще занимает всю эту память (если это и является причиной проблемы.
В старом проекте используются строковые константы в разных местах. В новом коде для одной и той же вещи используется массивное перечисление. (В целом новый код использует больше констант.)
Что я могу сделать, чтобы отследить пики памяти? Память очищается приложением, когда оно отбрасывает все, что использует, но, похоже, не отбрасывает вещидо тех пор, пока приложение не закроется.
Буду признателен, если кто-нибудь поможет мне указать правильное направление.
Редактировать:
Это выглядит как будто пик вызван вызовами библиотеки KosherCocoa . Если кто-то возражает взглянуть на это и сказать, что я делаю там неправильно,насколько управление памятью идет, я быдействительно ценю это.