Почему я должен освободить эти данные?Я владелец? - PullRequest
7 голосов
/ 18 июня 2011

Это странно.В техническом вопросе и ответе Apple говорит следующее:

void *data = CGBitmapContextGetData (cgctx);
if (data != NULL)
{

    // **** You have a pointer to the image data ****

    // **** Do stuff with the data here ****

}

// When finished, release the context
CGContextRelease(cgctx); 
// Free image data memory for the context
if (data)
{
    free(data);
}

Я просмотрел документацию для CGBitmapContextGetData, и там не упоминается, что я отвечаю за освобождение данных при вызовеэтот.Уже есть вызов CGContextRelease, который очищает контекст.

Какой смысл в дополнительных выпусках данных внутри контекста?Это просто указатель на эти данные, верно?Почему они звонят free(data) здесь?

Ответы [ 2 ]

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

Обновление : я забыл прочитать весь пример кода. Apple выделяет bitmapData в CreateARGBBitmapContext(), но не освобождает его. Что совершенно нормально, так как контекст все еще должен рисовать в нем.

Однако, bitmapData позже придется выпустить, когда они закончат с чертежом, что в точности и делается в конце ManipulateImagePixelData(). Поэтому, хотя выпустить что-то, полученное функцией get, необычно, это , пример кода правильный .

Чтобы избежать путаницы при освобождении чего-то, что было возвращено функцией get, можно сохранить данные растрового изображения в глобальной переменной / экземпляре и free(), когда это будет сделано.


Я бы предположил, что это ошибка в примере кода. В документации этой функции не упоминается ничего особенного, поэтому нет причины, по которой Get Rule здесь не будет применяться. Документация Quartz 2D также особо подчеркивает, что модель управления памятью CoreFoundation применяется к API Quartz 2D.

1 голос
/ 18 июня 2011

Я на 100% не знаком с кодированием всего, что связано с Apple, но я думаю, что cgctx не имеет ничего общего с указателем данных, поэтому вам придется освободить его самостоятельно. И.Е. CGContextRelease () не очищает указатель.

...