我已经确定了一个错误,而对抗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及更高版本。的我还没有证实在设备上的错误。

有帮助吗?

解决方案

在问题指针似乎是图像的数据提供者。如果我释放图像之前插入此行:

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设备)予应用此修复在模拟器上仅

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top