Xcode / Swift - не удается решить проблемы с памятью с помощью инструментов - PullRequest
1 голос
/ 10 мая 2019

У моего приложения есть проблемы с памятью, при которых после определенного порога происходит сбой приложения.

Я получил указание использовать инструменты и выбрать опцию Allocation.

Однако я никогда не получаю «прямого» ответа на мою проблему, я приложил скриншоты ниже, чтобы помочь лучше описать проблему.

Memory allocation depicted with Instrument

* +1012 *The root of the issue

Проблемы с памятью не связаны ни с какими ViewControllers или файлами, которые я создал. Скорее использовались другие библиотеки / фреймворки, о которых я понятия не имел. Я боролся с этой проблемой в течение нескольких недель, я изменил свой код / ​​реализовал множество методов, которые, как я полагал, могли решить проблему. Однако не повезло.

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

Спасибо.

Редактировать - Добавлен скриншот использования памяти при просмотре изображения в полном разрешении и возвращении на домашний экран.

Screenshot of memory usage when going back and forth between views* * 1030

Ответы [ 3 ]

0 голосов
/ 10 мая 2019

Пара мыслей:

  1. См. этот ответ , в котором говорится об использовании инструмента «Диаграмма отладочной памяти», показанного в видео WWDC 2016 Визуальная отладка с помощью Xcode . Этот инструмент часто легче найти проблемы, чем инструменты. Он упорядочивает типы подсчета ссылок по целевому объекту / структуре, что значительно упрощает просмотр результатов.

    Но если вы имеете дело с неконтролируемыми malloc данными, то инструменты - это путь, со всей сложностью, которая влечет за собой. Но «График отладочной памяти» часто является лучшей первой линией защиты.

  2. Вы сказали:

    Проблемы с памятью не связаны с какими-либо ViewControllers или файлами, которые я создал.

    Удостоверьтесь, что ваши классы не спрятаны там внизу списка. Их будет намного меньше, а размеры будут меньше, поэтому они не будут отображаться вверху, и они будут похоронены в списке, даже если они, вероятно, являются причиной проблемы. Честно говоря, если ваше приложение запущено, некоторые из ваших классов должны иметь где-то . Лол.

    Опять же, подход «Диаграмма отладочной памяти» помогает намного легче идентифицировать ваши собственные объекты, чем инструменты.

  3. Если возможно, я бы предложил запустить приложение, вернуться на какой-то домашний экран, где вы ожидаете, что материал будет выпущен, и повторить этот процесс несколько раз. Первый раз, когда вы возвращаетесь в состояние покоя, не очень хорошо освещает, потому что будет происходить много внутреннего кеширования. Но в следующий раз, когда вы запустите приложение и вернетесь к этому домашнему экрану, у вас будет лучший пример того, что распределяется и не освобождается без всего этого шума, который ОС делала на первой итерации:

    enter image description here

    (взято из WWDC 2013 Исправление проблем с памятью .)

    Надеемся, что «разогревающая» память не слишком драматична, но красная область - это то, на чем мы часто фокусируемся, поскольку это то, что «теряется», когда мы продолжаем использовать приложение (что приводит к возможным сбоям).

    К сожалению, ваша кривая распределения вообще не показывает ее падение, что вызывает беспокойство. Теперь, может быть, у вас нет «домашнего экрана», к которому вы можете вернуться, поэтому, возможно, это не имеет значения. Но даже в этом сценарии у вас должно быть какое-то состояние в приложении, чтобы вы могли видеть, как восстанавливается память. Трудно сказать на основании предоставленной информации.

  4. Вы не упомянули об этом, но подтвердите, какие опции отладки у вас есть. Например, если у вас включены зомби, вы можете не увидеть падение памяти так сильно, как следовало бы. Часто, когда мы впервые сталкиваемся с такого рода проблемами, мы начинаем переключаться на все эти параметры отладки, но они влияют на профиль памяти приложения. Поэтому, если вы включаете такие вещи, как зомби или что-то еще, вы можете отключить их, чтобы убедиться, что они не являются частью поведения, которое вы наблюдаете.

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

  6. Это все общие советы, и мы не можем предложить конкретный совет, не видя, что делает ваш код. Я бы посоветовал вам создать копию своего проекта, исключить несвязанные материалы и продолжать делать это до тех пор, пока у вас не будет наименьшего воспроизводимого примера такого необузданного роста памяти. Часто этого процесса достаточно, чтобы самостоятельно диагностировать проблему. Но мы не можем пролить тонны кода. Нам нужен минимальный, полный и проверяемый пример проблемы.

Суть в том, что «График отладочной памяти» часто является нашим первым уровнеманализ.Запустите приложение, определите, какие объекты вы ожидали выпустить, но не сделали, и переходите оттуда.Также следите за тем, сколько таких объектов существует (например, если вы видите один и тот же контроллер представления несколько раз, это признак сильного референтного цикла или некоторого циклического вызова контроллеров представления).

0 голосов
/ 29 мая 2019

Я исправил проблемы, которые у меня были.На всякий случай, если кто-нибудь в будущем столкнется с такими же проблемами, это то, что я сделал:

  1. Если объявил мои точки / делегаты как weak
  2. Где бы я ни использовал ключевое слово self вблок, где XCode потребовал, чтобы я использовал self, я добавил либо [weak self] in, либо [unowned self] in
  3. Удалите все вхождения слова self, которые не были необходимы
  4. Добавлен deinit и включил оператор печати
  5. Добавлена ​​точка останова, где метод deinit вызывается
  6. Закомментированы функции в моем методе viewDidLoad и просмотрите каждую из них, чтобы увидеть, какая из них / есливызвал проблему.
0 голосов
/ 10 мая 2019

Инструмент просто показывает вам, как ваше приложение обрабатывает память / ЦП и т. Д. Когда вы находите что-то в инструменте, вы должны внести изменения в код.

См. Это: Для этого вы должны понимать, как stong и weak работают в iOS.

Как только вы понимаете ARC в iOS. Вы поймете утечки памяти в вашем коде.

Трюк это:

  1. Попробуйте проверить количество объектов, которые не удаляются из памяти инструмента.
  2. Затем проверьте код для строгой ссылки на объект и попытайтесь удалить ненужные strong ссылки.

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

...