2012-06-13 39 views
0

我写了一个小功能来放大2x。但是当我运行它时会出现EXC_BAD_ACCESS错误。以下是密码为我的功能提供EXC_BAD_ACCESS的iOS

- (CGImageRef)CGImageScale2x:(CGImageRef)imgRef 
{ 
    CGFloat width = CGImageGetWidth(imgRef); 
    CGFloat height = CGImageGetHeight(imgRef); 

    CGRect imgRect = CGRectMake(0, 0, width, height); 
    CGAffineTransform transform = CGAffineTransformMakeScale(2.0, 2.0); 
    CGRect scaledRect = CGRectApplyAffineTransform(imgRect, transform); 

    CGColorSpaceRef colorSpace = CGColorSpaceCreateDeviceRGB(); 
    CGContextRef bmContext = CGBitmapContextCreate(NULL, 
                scaledRect.size.width, 
                scaledRect.size.height, 
                8, 
                0, 
                colorSpace, 
                kCGImageAlphaPremultipliedFirst); 
    CGContextSetAllowsAntialiasing(bmContext, FALSE); 
    CGContextSetInterpolationQuality(bmContext, kCGInterpolationNone); 
    CGColorSpaceRelease(colorSpace); 
    CGContextScaleCTM(bmContext, 2.0, 2.0); 
    CGContextDrawImage(bmContext, CGRectMake(0, 0, 
              scaledRect.size.width, 
              scaledRect.size.height), 
         imgRef); 

    CGImageRef scaledImage = CGBitmapContextCreateImage(bmContext); 
    CFRelease(bmContext); 
    [(id)scaledImage autorelease]; 

    return scaledImage; 
} 

我是iOS新手。请帮忙。

感谢

+0

嗯,对于一件事,你通过传递0作为“CGBitmapContextCreate”的第五个参数并且为另一个你不能自动释放CG对象而说“我的上下文每行有零个字节”。不要尝试。 – borrrden

+0

@borrrden嗨,我正在修改一个已经工作的功能来旋转图像做我的缩放。在该函数中,CGBitmapContextCreate的第五个参数是零,并且还为CGImageRef对象调用autorelease。该功能工作正常。所以我怀疑这是否是错误。请发表评论 – Shamy

+0

Autorelease是一个Objective-c函数,但CGImageRef是一个C对象,所以autorelease不适用于它(并且它最终都不会被autorelease池调用)。知道哪条线路导致崩溃也很有帮助。就零事件而言,苹果可能已经停止在后端使用它,因为他们意识到它们可以计算它,但在那里零就很奇怪。 – borrrden

回答

1

CGImageRef不能自动释放,它的核心基础类型。尝试使用CGImageRelease(scaledImage)代替。

+1

应该是'CGImageRelease',但是除了命名之外,可能再没什么区别了。 – borrrden

+0

你是对的,谢谢 –

相关问题