Предлагает ли график памяти XCode какие-либо интеллектуальные визуальные индикаторы для надежных ссылок, которые не являются циклами памяти? - PullRequest
1 голос
/ 22 мая 2019

Как продолжение моего предыдущего Как я могу создать ссылочный цикл, используя dispatchQueues? :

Для сильных ссылок (которые создают утечки, но не являются ссылочными циклами), например Timer, DispatchSourceTimer, DispatchWorkItem, график памяти не создает фиолетовый значок, я подозреваю, что это просто потому, что он не находит двух объектов, строго указывающих друг на друга.

Я знаю, что могу пойти туда-сюда и заметить, что определенный класс просто не покидает память, а задается вопросом, предоставляет ли Xcode что-то еще.

  • Есть ли другой индикатор?
  • Я знаю, что Xcode визуально показывает количество экземпляров типа в памяти. Но есть ли способ отфильтровать объекты, которые имеют более 3 экземпляров в памяти?

1 Ответ

1 голос
/ 22 мая 2019

Вы спрашиваете:

Для сильных ссылок (которые создают утечки, но не циклы ссылок), например, Timer, DispatchSourceTimer, DispatchWorkItem, график памяти несоздайте фиолетовый значок, я подозреваю, что это просто потому, что он не находит двух объектов, строго указывающих друг на друга.

Да.Или более точно, сильное предупреждение опорного цикла производится при наличии двух (или более объектов), чьи только сильные ссылки между собой.

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

В качестве примера рассмотрим повторение таймера, который сохраняет сильную ссылку на наш объект.Основной цикл выполнения хранит сильную ссылку на этот таймер и не будет освобождать его, пока таймер не станет недействительным.В узком смысле этого слова нет строгого ссылочного цикла, поскольку у нашего приложения нет сильной ссылки на цикл выполнения или таймер.Но, тем не менее, повторяющийся таймер будет сохранять сильную ссылку на наш объект (если мы не использовали шаблон [weak self] или что-то еще).

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

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

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

Я знаю, что могу пойти взад-вперед и заметить, что определенный класс просто не покидает память, а интересуется, предоставляет ли Xcode что-то еще.

  • Есть ли какой-нибудь другой индикатор?

Нет, не то, что я знаю.

  • Я знаю, Xcode визуально показывает количество экземпляровтипа в памяти.Но есть ли способ отфильтровать объекты, которые имеют более 3 экземпляров в памяти?

Опять нет, не то, что я знаю.

...