iOS: CGImageCreateWith [PNG o JPEG] DataProvider causa un error de segmentación

Me enfrento a un problema extraño. Estoy desarrollando una utilidad de escáner de código de barras de línea de comandos de iOS usando libzbar (sí, esto es para dispositivos con jailbreak). Todo va bien, excepto cuando estoy tratando de usar elCGImageCreateWithPNGDataProvider() oCGImageCreateWithJPEGDataProvider() métodos para obtener unCGImageRef desde un archivo, porque estas dos funciones generan un error de segregación en mi iPad 5.1.1. El problema no está en mi clase personalizada,ZBarScanner, porque si uso un UIImage para obtener los datos de la imagen, usar algo como

UIImage *uiImage = [UIImage imageWithContentsOfFile:fname];
CGImageRef image = uiImage.CGImage;

luego funciona bien e imprime los datos almacenados en el código de barras. Además, las imágenes PNG y JPEG están bien formateadas: puedo verlas con un explorador de archivos en el propio dispositivo y también probé varias otras imágenes. Incluso traté de omitir todas lasCFRelease() función llama yrelease Mensajes para evitar tener punteros colgando. Aquí está mi código:

#define LOG() NSLog(@"Reached line %d", __LINE__)

int main(int argc, char **argv)
{
    if (argc != 2)
            return 1;

    NSAutoreleasePool *pool = [[NSAutoreleasePool alloc] init];

    LOG(); // line 21

    NSString *fname = [[NSString stringWithUTF8String:argv[1]] retain]; // added an extra retain just in case

    LOG(); // line 25

    CFDataRef data = (CFDataRef)[NSData dataWithContentsOfFile:fname];
    CGDataProviderRef dProv = CGDataProviderCreateWithCFData(data);
    // I also tried using
    // dProv = CGDataProviderCreateWithFilename(argv[1]);
    // that made no difference either. The data and data provider are
    // valid, but the CGImage constructors always segfault.
    if (dProv == NULL) {
        fprintf(stderr, "Invalid CGDataProvider\n");
        abort();
    }

    LOG(); // line 34

    CGImageRef image = NULL;

    if ([[fname pathExtension] isEqualToString:@"png"]) {
        LOG(); // line 39
        NSLog(@"Function pointer: %p", CGImageCreateWithPNGDataProvider);
        image = CGImageCreateWithPNGDataProvider(dProv, NULL, false, kCGRenderingIntentDefault); // This function segfaults, or...
        LOG();
    } else if ([[fname pathExtension] isEqualToString:@"jpg"]
        || [[fname pathExtension] isEqualToString:@"jpeg"]) {
        LOG();
        image = CGImageCreateWithJPEGDataProvider(dProv, NULL, true, kCGRenderingIntentDefault); // ... or this one.
        LOG();
    } else {
        fprintf(stderr, "File '%s' is neither a PNG nor a JPEG file!\n", argv[1]);
        LOG();
        abort();
    }

    LOG();
    // CFRelease(dProv);
    LOG();
    ZBarScanner *scanner = [ZBarScanner zbarScannerWithCGImage:image];
    // CFRelease(image);
    LOG();
    NSArray *arr = [scanner scan];
    NSLog(@"The result of the scanning is:\n%@", arr);
    LOG();
    [pool drain];

    return 0;
}

Si lo ejecuto en el depurador (se ha eliminado el desorden de GDB y NSLog para mayor claridad):

gdb ./scanner
(gdb) run ./barcode1.png
Reached line 21
Reached line 25
Reached line 34
Reached line 39
Function pointer: 0x37c5b535

Program received signal EXC_BAD_ACCESS, Could not access memory.
Reason: KERN_INVALID_ADDRESS at address: 0x00000000
0x00000000 in ?? ()
(gdb) backtrace
#0 0x00000000 in ?? ()
(gdb)

Así que incluso el retroceso no muestra nada obviamente malo / útil ... Parece quealguna cosa es nuloalgun lado. Incluso sospeché que debido a que mi cadena de herramientas no es una compilación basada en 4.0, estas funciones podrían no estar disponibles en iOS 5.1.1, por lo que la compilación se realiza correctamente comoCGImageCreateWith[...]DataProvider los simbolos estan dentro deldesarrollo sysroot pero no entre iOS 'real bibliotecas dinámicas, pero si este fuera el caso, el puntero a la función I NSLogged seríaNULL, ¿derecho? Sin embargo, ninguno de los objetos NS y CG ni las funciones parecen ser NULL, el único NULL que paso a los constructores de CGImage es undecodeArray parámetro, pero se menciona explícitamente en la documentación de Apple que puede ser NULL ... (Actualizar: Intenté pasar una matriz válida que no es NULL para averiguar si la documentación es incorrecta, pero sigo recibiendo el mismo error).

¿Podría por favor darme alguna sugerencia (juego de palabras intencional) sobre este accidente? ¿Que me estoy perdiendo aqui? Todos los tutoriales y referencias que he encontrado hasta ahora sugieren usar CGDataProvider y CGImage de esta manera.

Respuestas a la pregunta(1)

Su respuesta a la pregunta