Frage

Ich habe einen Fehler identifiziert, während er gegen das OS 3.0 SDK iPhone zu entwickeln. Grundsätzlich, wenn ich eine CGImage aus einem Bitmap-Bildkontext zu erstellen, ich die folgenden Fehlermeldung erhalten, wenn ich es loslassen:

malloc: *** error for object 0x1045000: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug

Hier ist der relevante Code:

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.

Das obige Beispiel ist in sich abgeschlossen und es ist ziemlich klar, nicht behalten / Release Regeln verletzt werden. Ich habe diesen Code auf dem iPhone Simulator getestet unter 3.0, 3.1 und 3.1.2. Das Problem tritt nur unter 3,0; es scheint in 3.1 und später wurden behoben. Ich habe nicht den Fehler auf dem Gerät bestätigt.

War es hilfreich?

Lösung

Das Problem Zeiger scheint das Image des Datenanbieter zu sein. Wenn ich diese Zeile ein, bevor das Bild Freigabe:

CFRetain(CGImageGetDataProvider(image));

dann ist alles gut auf 3,0. Aber, wenn die App auf einem späteren OS ausgeführt wird, wird der Datenanbieter geleckt werden. So müssen Sie die OS-Version überprüfen oder einfach ignorieren (malloc protokolliert eine Fehlermeldung jedoch nicht eine Ausnahme oder unterbricht die App in irgendeiner Art und Weise werfen). Ich habe das folgende Makro benutze:

#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

Da ich es auf dem Gerät nicht wiedergeben kann (ich habe keine Geräte mit 3.0) Ich beantrage dieses Update auf dem Simulator nur.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top