iOS CGBitmapContextCreate копирует данные? - PullRequest
0 голосов
/ 25 февраля 2012

Я написал этот фрагмент кода:

 bitmapData = calloc(1, bitmapByteCount );
 context = CGBitmapContextCreate (bitmapData,
                                 pixelsWide,
                                 pixelsHigh,
                                 8,
                                 bitmapBytesPerRow,
                                 colorSpace,
                                 kCGImageAlphaOnly);

Когда я делаю это, CGBitmapContext копирует мои bitmapData, поэтому после этих строк я должен писать

free(bitmapData); 

Ответы [ 2 ]

5 голосов
/ 25 февраля 2012

Если вам нужно bitmapData, не освобождайте его. Если вам это не нужно, вместо этого передайте NULL в качестве параметра, и Quartz выделит себе память (iOS 4.0 и более поздние версии).

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

Но Quartz не копирует bitmapData, он выполняет рендеринг там. После освобождения context вы должны освободить эту память.

Редактировать: В одном из примеров Apple проектов память освобождается, но не сразу:

float drawStage3(CGContextRef context, CGRect rect)
{
    // ...
    cachedData = malloc( (((ScaledToWidth * 32) + 7) / 8) * ScaledToHeight);
    // ...
    bitmapContext = CGBitmapContextCreate(cachedData /* data */,
    // ...
    CFRelease(bitmapContext);
    // ...
    // Clean up
    CFRelease(cachedImage);
    free(cachedData);
}
1 голос
/ 25 февраля 2012

EDIT:

Ваш код выделяет блок памяти через calloc - у вас есть этот блок памяти. Итак, вы владеете свободными этой памятью. CGBitmapContext create - это просто создание контекста с использованием созданного вами блока памяти (вот почему вы должны передать его). Когда вы закончите с этим блоком памяти, вы должны освободить его.

Сначала я бы сделал CFRelease в контексте. Какие бы ресурсы ни создавал контекст, об этом позаботится CFRelease.

«Правило создания» в Core Foundation Guide Memory Говорит:

Базовые функции Foundation имеют имена, которые указывают, когда у вас есть возвращаемый объект:

Функции создания объектов, в которые встроено «Создать»; Функции дублирования объектов, в которые встроено «Копирование». Если Вы владеете объектом, это ваша ответственность, чтобы отказаться от собственности (используя CFRelease), когда вы закончите с ним.

...