Подтвердить что ты не робот

Что такое CG Raster Data?

Я пытаюсь найти другую утечку памяти в моем коде, и я не могу понять, что такое CG Raster Data. При просмотре VM Tracker с включенными автоматическими моментальными снимками, CG Raster Data, кажется, является единственной частью, которая увеличивается. Они также неуклонно растут без увеличения ассигнований.

Я не совсем уверен, что такое CG Raster Data, и как я его исправил, но в этот момент возрастающий след в конечном итоге вызывает ошибку памяти и сбоя, поэтому это не хорошо! Я делаю свой собственный рендеринг текста (используя CoreText), поэтому я думаю, что это имеет какое-то отношение к нему. Я также загружаю фотографии?

Ниже изображен снимок: Peaks in the allocations when the pages load (the app loads pages with images and text discretely), the dirty memory always increases though.

ОБНОВЛЕНИЕ: Эта проблема по-прежнему сохраняется, но достаточно интересно, что я могу сопоставить ее с утечкой в ​​UIFoundations на что-то, что называется "NSConcreteGlyphGenerator". Кажется, это происходит только тогда, когда я вызываю метод boundingRectWithSize: для атрибутной строки в методе CoreText, который на самом деле рисует. Линией, в частности, является:

[displayString boundingRectWithSize:CGSizeMake( self.frame.size.width, self.frame.size.height ) options:0 context:nil];

Медленно отслеживая его...

4b9b3361

Ответ 1

Я не знаю всего, что может содержать "растровые данные CG", но одна вещь, которую я знаю наверняка, содержит... память, выделенную Core Graphics для хранения растровых данных, а также растровых изображений.

В частности, в моем приложении я создаю два растровых контекста 256x256, используя CGBitmapContextCreate. Я передаю NULL как параметр data, так что Core Graphics выделяет для меня растровую память. Битовая карта 256x256 с 32 битами (4 байта) на пиксель занимает 256 KiB = 64 страницы по 4 KiB каждый. В Инструментах я получаю два блока "CG растровых данных" по 65 страниц каждый. Если я прокомментирую один из этих растровых контекстов, я получаю только один 65-страничный блок "Растровые данные CG" в "Инструменты".

С другой стороны, у меня также есть CATiledLayer в моем приложении. CATiledLayer устанавливает для меня собственные графические контексты, и я считаю, что он создает эти контексты с использованием разделяемой памяти, к которой напрямую обращаются сервер окон (springboard на iOS 5, backboard на iOS 6). Я не вижу никаких блоков "CG растровых данных", соответствующих этим графическим контекстам.

Ответ 2

У меня была такая же проблема с увеличением памяти CG Raster Data, просто нажимая и выталкивая контроллер просмотра повторно. Я потратил некоторое время, думая, что это проблема с некоторым кодом рисования. Я, наконец, отследил его до делегата, который слабо ссылался на контроллер вида, который был нажат и выскочил, поэтому, когда я вытащил контроллер вида, он не был освобожден. CG Raster Data оказалась самой большой частью следа контроллера, поэтому я ошибочно объяснил эту проблему тем, что на самом деле, когда это был действительно сам контроллер представления, который не был выпущен (поэтому, не выпуская его взглядов, некоторые из который имел CG Raster Data).

Вкратце: если вы видите утечки памяти с помощью CG Raster Data, посмотрите на контроллеры представлений, которые могут иметь представления с ними, и убедитесь, что они освобождены.

Ответ 3

Это не очень важный ответ, но так, чтобы кто-то начал расследование...

Я думаю, что CG Raster Data является новым с iOS 6, но присутствовал в iOS 5 как CG Image. Я тестировал как на симуляторах, так и на iOS 5, CG Raster Data не присутствовал, но если сравнить общие суммы на iOS 6 и iOS 5, CG-изображение примерно равно CG Raster Data, а CG Image не отображаются на iOS 6. Поэтому я уверен, что они просто переименовали CG Image в CG Raster Data.

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

Ответ 4

Когда у меня возникла проблема с этим, "CG Raster Data" поступала из образа, который я создал из вызова в UIGraphicsGetImageFromCurrentImageContext из UIGraphicsBeginImageContextWithOptions. Мне потребовался день, чтобы отследить проблему, и в конце концов это не было связано с тем, как изображение было сделано вообще. В моем случае я случайно поместил изображение в собственный NSCache в другой части кода, не осознавая этого.

Если у вас возникла проблема с выпуском CG Raster Data, вы должны подумать, что источник того, где были созданы данные, вполне может не иметь никакого отношения к реальной проблеме. Возможно, данные изображения просто сохраняются, когда вы этого не ожидаете, а ярлык "CG Raster Data", который вы видите в "Инструменты", просто ссылается на то, откуда были получены данные. Вы должны проверить, чтобы убедиться, что вы не делаете что-то вроде нескольких addSubviews, в то время как не удается удалитьFromSuperview (например, с помощью UIImageViews) или помещать изображение в кеш, массив, сильную переменную и т.д.

Ответ 5

Если вас беспокоит использование памяти (89 МБ), это немного. Пробовали ли вы имитировать предупреждение памяти в симуляторе (Simulator > Hardware > Simulate Memory Warning)?

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

Скорее всего, вам может потребоваться освободить ваши изображения, наблюдая сообщение о предупреждении памяти:

[[NSNotificationCenter defaultCenter] addObserver:self selector:@selector(handleMemoryWarning:) name:UIApplicationDidReceiveMemoryWarningNotification object:nil];

Очистите все объекты изображения в методе handleMemoryWarning.

Ответ 6

Не совсем ответ. Но еще несколько подсказок, которые я выяснил при решении моей утечки данных CG-растра:

  • cg-растровые данные содержат память CGIMageRefs (по крайней мере, созданную из CGBitmapContextCreateImage() из контекста, созданного CGBitmapContextCreate (NULL,...)
  • У меня была утечка CGImageRelease(). Я использовал изображение для передачи как содержимое CALayer и предположил, что это свойство содержит ссылку. Но похоже, что это присваивание копирует изображение. По крайней мере, у меня нет проблем с вызовом CGImageRelease сразу после назначения.

Надеюсь, что кто-то поможет...