Как правильно очистить память при создании CGContextRef? - PullRequest
5 голосов
/ 18 июня 2011

Когда я создаю CGContextRef вручную, используя CGBitmapContextCreate(), мне нужно вручную также освобождать растровые данные?

Сейчас я делаю это: у меня есть метод, который создает и возвращает CGContextRef,Внутри этого метода я также создаю данные для этого контекста, например:

bitmapData = malloc(bitmapByteCount);
context = CGBitmapContextCreate(bitmapData, ...);
return context;

До сих пор я всегда считал, что все нормально, когда вызывающий этот метод просто выпускает CGContextRef после его использования: CGContextRelease(theContext);

Из документации CGBitmapContextCreate:

В iOS 4.0 и более поздних версиях и Mac OS X v10.6 и более поздних версиях вы можете передать NULL, если хотите, чтобы Quartzвыделить память для растрового изображения.Это освобождает вас от управления собственной памятью, что уменьшает проблемы с утечкой памяти.

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

Итак, я должен сделать это:

void *data = CGBitmapContextGetData(context);
if (data != NULL) {
    free(data);
}

Итак, у меня большая утечка памяти, если я не реорганизую весь свой кодвыпустить также растровые данные, а не только контекст?

1 Ответ

3 голосов
/ 18 июня 2011

Да. В конечном итоге вам необходимо free() bitmapData (когда CGContext завершит рисование и т. Д.), Если вы malloc() его редактировали.

См. Мой (исправленный) ответ на ваш другой вопрос .

Если вы используете опцию NULL (то есть, если вы делаете , а не malloc() ваши bitmapData), я ожидаю, что указатель данных будет действительным, пока вы не CGContextRelease() ваш контекст. Таким образом, вам нужно либо сделать все, что вы хотите сделать с данными, прежде чем освобождать контекст, либо скопировать куда-нибудь растровые данные (в этом случае вы также можете заранее malloc() память и передать ее в контекст).

...