См. этот ответ , в котором говорится об использовании инструмента «Диаграмма отладочной памяти», показанного в видео WWDC 2016 Визуальная отладка с помощью Xcode . Этот инструмент часто легче найти проблемы, чем инструменты. Он упорядочивает типы подсчета ссылок по целевому объекту / структуре, что значительно упрощает просмотр результатов.
Но если вы имеете дело с неконтролируемыми malloc
данными, то инструменты - это путь, со всей сложностью, которая влечет за собой. Но «График отладочной памяти» часто является лучшей первой линией защиты.
Вы сказали:
Проблемы с памятью не связаны с какими-либо ViewControllers или файлами, которые я создал.
Удостоверьтесь, что ваши классы не спрятаны там внизу списка. Их будет намного меньше, а размеры будут меньше, поэтому они не будут отображаться вверху, и они будут похоронены в списке, даже если они, вероятно, являются причиной проблемы. Честно говоря, если ваше приложение запущено, некоторые из ваших классов должны иметь где-то . Лол.
Опять же, подход «Диаграмма отладочной памяти» помогает намного легче идентифицировать ваши собственные объекты, чем инструменты.
Если возможно, я бы предложил запустить приложение, вернуться на какой-то домашний экран, где вы ожидаете, что материал будет выпущен, и повторить этот процесс несколько раз. Первый раз, когда вы возвращаетесь в состояние покоя, не очень хорошо освещает, потому что будет происходить много внутреннего кеширования. Но в следующий раз, когда вы запустите приложение и вернетесь к этому домашнему экрану, у вас будет лучший пример того, что распределяется и не освобождается без всего этого шума, который ОС делала на первой итерации:
(взято из WWDC 2013 Исправление проблем с памятью .)
Надеемся, что «разогревающая» память не слишком драматична, но красная область - это то, на чем мы часто фокусируемся, поскольку это то, что «теряется», когда мы продолжаем использовать приложение (что приводит к возможным сбоям).
К сожалению, ваша кривая распределения вообще не показывает ее падение, что вызывает беспокойство. Теперь, может быть, у вас нет «домашнего экрана», к которому вы можете вернуться, поэтому, возможно, это не имеет значения. Но даже в этом сценарии у вас должно быть какое-то состояние в приложении, чтобы вы могли видеть, как восстанавливается память. Трудно сказать на основании предоставленной информации.
Вы не упомянули об этом, но подтвердите, какие опции отладки у вас есть. Например, если у вас включены зомби, вы можете не увидеть падение памяти так сильно, как следовало бы. Часто, когда мы впервые сталкиваемся с такого рода проблемами, мы начинаем переключаться на все эти параметры отладки, но они влияют на профиль памяти приложения. Поэтому, если вы включаете такие вещи, как зомби или что-то еще, вы можете отключить их, чтобы убедиться, что они не являются частью поведения, которое вы наблюдаете.
Я бы посоветовал имитировать предупреждения памяти и посмотреть, можно ли увидеть восстановление памяти. Убедитесь, что ваш код наблюдает и отвечает на предупреждения памяти, очищая память, где это возможно.
Это все общие советы, и мы не можем предложить конкретный совет, не видя, что делает ваш код. Я бы посоветовал вам создать копию своего проекта, исключить несвязанные материалы и продолжать делать это до тех пор, пока у вас не будет наименьшего воспроизводимого примера такого необузданного роста памяти. Часто этого процесса достаточно, чтобы самостоятельно диагностировать проблему. Но мы не можем пролить тонны кода. Нам нужен минимальный, полный и проверяемый пример проблемы.
Суть в том, что «График отладочной памяти» часто является нашим первым уровнеманализ.Запустите приложение, определите, какие объекты вы ожидали выпустить, но не сделали, и переходите оттуда.Также следите за тем, сколько таких объектов существует (например, если вы видите один и тот же контроллер представления несколько раз, это признак сильного референтного цикла или некоторого циклического вызова контроллеров представления).