Источник ошибки malloc при выпуске CGImage на iPhone OS 3.0?

StackOverflow https://stackoverflow.com/questions/1968471

  •  21-09-2019
  •  | 
  •  

Вопрос

Я выявил ошибку при разработке с использованием 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.

Приведенный выше пример является автономным, и довольно ясно, что никакие правила сохранения / выпуска не нарушаются.Я тестировал этот код на симуляторе iPhone в версиях 3.0, 3.1 и 3.1.2.Проблема возникает только в версии 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