Я пытаюсь создать растровое изображение в памяти как часть функции шаблона, которую будет вызывать метод drawLayer: inContext: (этот метод является частью протокола делегата CALayer). Функция шаблона выглядит примерно так:
static const size_t kComponentsPerPixel = 4;
static const size_t kBitsPerComponent = sizeof(unsigned char) * 8;
NSInteger layerHeight = 160;
NSInteger layerWidth = 160;
CGContextSaveGState(context);
CGColorSpaceRef rgb = CGColorSpaceCreateDeviceRGB();
size_t bufferLength = layerWidth * layerHeight * kComponentsPerPixel;
unsigned char *buffer = malloc(bufferLength);
// The real function does something more interesting with the buffer, but I cut it
// to reduce the complexity while I figure out the crash.
for (NSInteger i = 0; i < bufferLength; ++i)
{
buffer[i] = 255;
}
//memset(buffer, 255, bufferLength);
CGDataProviderRef provider =
CGDataProviderCreateWithData(NULL, &buffer, bufferLength, NULL);//freeBitmapBuffer);
CGImageRef imageRef =
CGImageCreate(layerWidth, layerHeight, kBitsPerComponent,
kBitsPerComponent * kComponentsPerPixel,
kComponentsPerPixel * layerWidth,
rgb,
kCGBitmapByteOrderDefault | kCGImageAlphaLast,
provider, NULL, false, kCGRenderingIntentDefault);
CGContextDrawImage(context, CGRectMake(0, 0, 160, 160), imageRef);
CGImageRelease(imageRef);
CGDataProviderRelease(provider);
CGColorSpaceRelease(rgb);
CGContextRestoreGState(context);
Позже, когда drawLayer: inContext: вызывает CGContextFillRect для отображения шаблона, созданного этой функцией, я получаю EXC_BAD_ACCESS. Верх стека - CGSConvertAlphaByte. В тот момент я посмотрел на память буфера, и она показалась мне прекрасной - она была установлена точно на то, что было установлено при вызове функции шаблона.
Я думаю, что, возможно, я испортил какой-то параметр CGImageCreate, вполне возможно, флаги. Или буфер заполнен в неправильном порядке, но я не уверен, как я могу ошибиться, если заполню каждый байт одним и тем же значением.
Есть ли идеи или примеры аналогичного кода, который не дает сбоев?