在后台线程中调整CAImageRef的大小会导致100%的CPU和崩溃

时间:2011-03-10 10:47:42

标签: cocoa thread-safety core-graphics

从我读到的内容来看,Core Graphics应该是线程安全的。但是,当我在后台线程中运行下面的代码时(通过NSOperationQueue),我的Cocoa应用程序的CPU几乎达到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;
}

我从调试器暂停了该过程,但我在线程堆栈跟踪中找不到任何内容。我不知道是什么导致CPU飙升。除了使上面的代码线程安全之外,还有什么我需要做的吗?

谢谢,Mark。

1 个答案:

答案 0 :(得分:0)

问题在于这一行:

CGColorSpaceRelease(colorspace);

通过get调用获得颜色空间,因此调用者不得释放它。获得的经验:无论网站多么值得信赖,都要仔细检查从网上获得的源代码......