Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cocoa/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Cocoa 在后台线程中调整CAImageRef的大小会导致100%的CPU和崩溃_Cocoa_Thread Safety_Core Graphics - Fatal编程技术网

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

Cocoa 在后台线程中调整CAImageRef的大小会导致100%的CPU和崩溃,cocoa,thread-safety,core-graphics,Cocoa,Thread Safety,Core Graphics,据我所知,核心图形应该是线程安全的。然而,当我在后台线程(通过NSOperationQueue)中运行下面的代码时,我的Cocoa应用程序的CPU几乎达到100%,程序变得没有响应 如果我从主线程运行相同的代码,它就可以正常工作 - (CGImageRef) createResizedImageFrom:(CGImageRef)image withSize:(CGSize) size { CGColorSpaceRef colorspace = CGImageGetColorSpace

据我所知,核心图形应该是线程安全的。然而,当我在后台线程(通过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的峰值。除了使上述代码线程安全之外,我还需要做什么

谢谢,马克。

问题是这句话:

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