如果CGImageCreate的数据提供者使用应用程序创建的数组,那么对CGImageCreate的正确调用是什么样的呢?

我正在尝试在内存中创建一个位图作为模式函数的一部分,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的一些参数,很可能是旗帜。 或者缓冲区没有以正确的顺序填充,但是如果我用相同的值填充每个字节,我不知道怎么会出错。

类似代码的任何想法或示例都是非崩溃的?

好的,所以Apple dev论坛发现了这个错误:由于某些原因而不是缓冲区,我正在传递缓冲区。