iPhone - Утечка UIImage, Утечка CGBitmapContextCreateImage

Я использовал это переопределение в течение некоторого времени теперь:

def len(thingy):
    try:
        return thingy.__len__()
    except AttributeError:
        return sum(1 for item in iter(thingy))
5
задан bbullis21 15 September 2009 в 14:18
поделиться

6 ответов

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

0
ответ дан 14 December 2019 в 19:19
поделиться

ejabberdctl, безусловно, самый простой в этом конкретном случае. Другие варианты:

  • Реализовать полный клиентский XMPP в PHP (!)

  • Реализовать модуль в Erlang, который проксирует запросы:

0
ответ дан 14 December 2019 в 19:19
поделиться

Get Clang и запустите свой проект через него. Он не только найдет ваши (статические) утечки, она поможет вам понять больше о правилах сосредоточения - по крайней мере, это было для меня.

1
ответ дан 14 December 2019 в 19:19
поделиться

Некоторые идеи / мысли:

Для одного, этот кусок кода четко возникает проблемы, поскольку вы можете бесплатно бесплатно битмапдата, если контекст не выделит.

    if (context == NULL) { free (bitmapData); }

    CGColorSpaceRelease( colorSpace );
    free (bitmapData);

    if (context == NULL) { return NULL; }

Я также согласен с Benzado, что вам битмапдата, пока вы не закончите с контекстом ... Хотя это не врезается, который озадачен. повезло наверное.

Обратите внимание, что я уверен, что поставщик данных, а биты - это относится к тому, чтобы стать частью CGImage, возвращаемой из CGIMAGECREATE:

поставщик Источник данных для растрового изображения. Для получения информации о поддерживаемых форматах данных см. В разделе «Обсуждение» ниже. Кварц сохраняет этот объект; По возвращении вы можете смело освободить его.

Итак, это означает, что до возвращения UIMAGE вы не передадите, я не думаю, что CJImage или поставщик данных BITS уйдет. Итак, возможно, проблема состоит в том, что Uiimage не каждое уходит?

Почему вы не просто используете CGBitMapContextCreateImage () для создания полученного изображения? (Возможно, вам придется позвонить CGContextFlush (), чтобы заставить рисовать растровое изображение, но похоже, что вы делаете весь пиксель, изменяющийся вручную, так что не нужно).

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

Также:

Вы не инициализируете SRCDATA, DESTDATA и FinalData в NULL, чтобы ваш тест до свободных () их, кажется рискованным.

Все, что сказано (и попробуй некоторые из этих вещей), у нас была утечка в нашем приложении Mac в одной точке, потому что в 10,5,6 и ранее аспект CIIMAGE ImageWithCGImage, ImageByApplyingTransofRM, ImageBycripgingtorect, NSBitMapimageRep initwithciimage или NSBitMapimageRep Cgimage Отказ Это было зафиксировано в 10,5,7, так что возможно, что в версии IPhone существует что-то подобное в версии IPhone, на которой вы тестируете.

0
ответ дан 14 December 2019 в 19:19
поделиться

На самом деле, если я помню, [UIImage imageNamed] создает свой собственный кеш, который находится вне вашего контроля. Это будет учитывать наблюдаемое вами использование памяти. Вы можете прочитать больше здесь - http://www.alexcurylo.com/blog/2009/01/13/imagenamed-is-evil/ .

0
ответ дан 14 December 2019 в 19:19
поделиться

Я использовал Quartz много раз. Каждый раз, когда я это делаю, это кошмар. Насколько я заметил, и я исправил ошибку при отправке Apple проекта в качестве доказательства сбоя, верно одно из четырех:

  1. Кварц чертовски просачивается
  2. Освобождение памяти занимает слишком много времени
  3. он использует слишком много памяти без надобности или
  4. их комбинацию.

Однажды я создал простой проект, чтобы доказать это. У проекта была кнопка. При каждом нажатии кнопки на экран добавлялось маленькое изображение (100x100 пикселей). Изображение состоит из двух слоев: самого изображения и дополнительного слоя, содержащего пунктирную линию, проведенную вокруг границы изображения. Этот рисунок был выполнен в кварце. При 8-кратном нажатии на кнопку приложение вылетало. Вы можете сказать: нажатие кнопки 8 раз и 16 изображений были добавлены на экран, это причина сбоя, верно?

Вместо того, чтобы рисовать границу с помощью Quartz, я решил предварительно нарисовать границу на PNG и просто добавьте его как слой к объекту. Те же два слоя на каждый созданный объект. Правильно?

Я щелкнул 100 раз, добавив на экран 200 изображений и никаких сбоев. Память никогда не превышала 800 Кб. Я мог бы продолжать щелкать ... приложение продолжало работать быстрее и быстрее. Ни предупреждения о памяти, ни сбоя.

Apple должна срочно пересмотреть Quartz.

4
ответ дан 14 December 2019 в 19:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: