Инструментарий iOS: как интерпретировать шаблон выделения памяти?

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

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

Мои вопросы:

  1. Почему я не мог видеть эти огромные числа в куче?
  2. Откуда выделяется эта огромная память?
  3. Есть ли конкретное подробное представление (кроме дерева вызовов), которое отражает этот номер объятия?

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


person Wael Showair    schedule 01.10.2016    source источник


Ответы (1)


Пара мыслей:

  1. Будьте внимательны при фильтрации результатов дерева вызовов. Вы могли случайно удалить подпрограмму, с которой профилировщик связал память. Попробуйте (а) выбрать диапазон графика с рассматриваемым распределением (чтобы уменьшить количество шума в результатах); (b) удалить фильтр, а затем (c) развернуть дерево в той точке, где вы видите большой скачок памяти:

    ищите прыжок

  2. Лично мне часто бывает проще перевернуть дерево вызовов и скрыть системные библиотеки:

    введите здесь описание изображения

  3. Кроме того, вы также можете перейти в «Статистика» «Распределения» и найти большое распределение:

    введите здесь описание изображения

    Затем вы можете углубиться в это:

    введите здесь описание изображения

    Затем, щелкнув панель «Расширенные сведения» справа, перейдите к нужному коду:

    введите здесь описание изображения

  4. Если вы хотите, другой способ найти распределения в Xcode 8 — включить параметр «Malloc Stack» в вашей схеме, а затем использовать параметр «Debug Memory Graph», как описано в https://stackoverflow.com./a/30993476/1271826.

    Например, я использовал «Debug Memory Graph», нашел растровые данные CG, и я могу видеть граф объектов для этого 10-мегабайтного изображения, а также видеть стек, где это было размещено на панели «Расширенные детали» на панели Правильно:

    введите здесь описание изображения

person Rob    schedule 01.10.2016
comment
Спасибо, Роб, за ваш ответ, но я не уверен, как я могу связать ваш ответ с моими 3 связанными вопросами? - person Wael Showair; 02.10.2016
comment
Ваш первый вопрос был о том, почему я не вижу распределения в моем дереве вызовов, на что я ответил: (а) не фильтруйте дерево вызовов, как вы; и (б) обязательно выберите диапазон вокруг рассматриваемого распределения. Ваш второй вопрос заключался в том, откуда взялось это большое распределение, на которое никто не может ответить за вас, если не считать демонстрации различных способов определения распределений (и я показал вам три разных способа сделать это). Ваш третий вопрос был о том, какие еще существуют механизмы для поиска распределений, и снова я показал вам ряд альтернатив. Я не знаю, что еще я могу сделать. - person Rob; 02.10.2016
comment
Спасибо, Роб, за ваш ответ, но огромная память не появляется без какого-либо фильтра, и поэтому ваш ответ на a мне не помогает. что касается б, вы не ответили на него. наконец, для c, я действительно ценю ваши важные альтернативы, но ни одна из них не раскрывает эту огромную память. Поэтому я буду ждать любых других предложений от сообщества, которые могли бы помочь мне ответить на эти вопросы. Спасибо еще раз. - person Wael Showair; 03.10.2016