我正在尝试在内存中创建一个位图,作为 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 的一些参数,很可能是标志。或者缓冲区没有按正确的顺序填充,但是如果我用相同的值填充每个字节,我不确定我怎么会出错。
任何不崩溃的类似代码的想法或示例?