Изменение размера CAImageRef в фоновом потоке приводит к 100% процессору и сбоям - PullRequest
0 голосов
/ 10 марта 2011

Из того, что я прочитал, Core Graphics должна быть поточно-ориентированной.Однако, когда я запускаю приведенный ниже код в фоновом потоке (через NSOperationQueue), процессор моего приложения Cocoa резко возрастает почти до 100%, и программа перестает отвечать на запросы.

Если я запускаю тот же код из основного потока,все работает нормально.

- (CGImageRef) createResizedImageFrom:(CGImageRef)image withSize:(CGSize) size {

    CGColorSpaceRef colorspace = CGImageGetColorSpace(image);
    if (CGColorSpaceGetModel(colorspace) == kCGColorSpaceModelIndexed) {
        CGColorSpaceRelease(colorspace);
        NSLog(@"Indexed color space not supported.");
        return nil;
    }
    CGContextRef context = CGBitmapContextCreate(NULL, size.width, size.height,
                                                 CGImageGetBitsPerComponent(image),
                                                 CGImageGetBytesPerRow(image),
                                                 colorspace,
                                                 kCGImageAlphaPremultipliedFirst);
    CGColorSpaceRelease(colorspace);

    if(context == NULL)
        return nil;

    CGContextDrawImage(context, CGRectMake(0, 0, size.width, size.height), image);
    CGImageRef imgRef = CGBitmapContextCreateImage(context);
    CGContextRelease(context);

    return imgRef;
}

Я приостановил процесс из отладчика, но не смог найти ничего в трассировке стека потоков.Я не знаю, что вызывает скачок процессора.Есть ли что-то, что мне нужно сделать в дополнение к безопасности указанного выше кода?

Спасибо, Марк.

1 Ответ

0 голосов
/ 23 марта 2011

Проблема была в этой строке:

CGColorSpaceRelease(colorspace);

Цветовое пространство было получено с помощью вызова get, следовательно, вызывающий не должен освобождать его. Извлеченный урок: всегда перепроверяйте исходный код, который вы получаете из Интернета, независимо от того, насколько сайт заслуживает доверия ...

...