Cocoa 在后台线程中调整CAImageRef的大小会导致100%的CPU和崩溃
据我所知,核心图形应该是线程安全的。然而,当我在后台线程(通过NSOperationQueue)中运行下面的代码时,我的Cocoa应用程序的CPU几乎达到100%,程序变得没有响应 如果我从主线程运行相同的代码,它就可以正常工作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
- (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
调用获得的,因此调用者不能释放它。经验教训:无论网站多么值得信赖,都要仔细检查你从网上获得的源代码