我在针对iPhone OS 3.0 SDK进行开发时发现了一个错误。基本上,如果我从位图图像上下文创建CGImage,当我发布它时会出现以下错误:
malloc: *** error for object 0x1045000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
以下是相关代码:
CGSize size = CGSizeMake(100, 100);
CGColorSpaceRef cs = CGColorSpaceCreateDeviceRGB();
size_t bitsPerComponent = 8;
size_t bytesPerPixel = 4;
size_t bytesPerRow = size.width * bytesPerPixel;
void *bitmapData = calloc(size.height, bytesPerRow);
CGContextRef ctxt = CGBitmapContextCreate(bitmapData, size.width, size.height, bitsPerComponent, bytesPerRow, cs, kCGImageAlphaPremultipliedLast);
// we could draw something here, but why complicate things?
CGImageRef image = CGBitmapContextCreateImage(ctxt);
CGContextRelease(ctxt);
free(bitmapData);
CGColorSpaceRelease(cs);
CGImageRelease(image); // This triggers the error message.
上面的示例是自包含的,很明显没有违反保留/释放规则。我已经在3.0,3.1和3.1.2下的iPhone模拟器上测试了这段代码。问题只发生在3.0下;它似乎已在3.1及更高版本中得到修复。 我还没有确认设备上的错误。
答案 0 :(得分:1)
问题指针似乎是图像的数据提供者。如果我在释放图像之前插入此行:
CFRetain(CGImageGetDataProvider(image));
然后一切都很好3.0。但是,如果应用程序在以后的操作系统上运行,则数据提供程序将被泄露。所以你必须检查操作系统版本或者只是忽略它(malloc记录一条错误消息,但它不会抛出异常或以任何方式中断应用程序)。我一直在使用以下宏:
#if TARGET_IPHONE_SIMULATOR
// 3.0 CFVersion 478.470000
// 3.1 CFVersion 478.520000
#define BugFixRetainImageDataProvider(img) \
if (kCFCoreFoundationVersionNumber == 478.47) { \
CGDataProviderRef dp = CGImageGetDataProvider(img); \
if (dp) CFRetain(dp); \
}
#else
#define BugFixRetainImageDataProvider(img)
#endif
由于我无法在设备上重现它(我没有任何设备运行3.0),我只在模拟器上应用此修复程序。