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