1

为什么这会报告无效的上下文?

<Error>: CGContextSaveGState: invalid context 0x0. This is a serious error.
This application, or a library it uses, is using an invalid context and is
thereby contributing to an overall degradation of system stability and
reliability. This notice is a courtesy: please fix this problem. It will
become a fatal error in an upcoming update.

这发生在调用drawInRectUIImage 上的类别方法时:

- (UIImage *)myImagePaddedToSize:(CGSize)newSize {
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);
    CGSize oldSize = self.size;

    CGRect rect = (CGRect){
        {
            floorf((newSize.width-oldSize.width)/2),
            floorf((newSize.height-oldSize.height)/2)
        },
        oldSize
    };
    [self drawInRect:rect];
    UIImage *newImage = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();
    return newImage;
}

我的理解是,这UIGraphicsBeginImageContextWithOptions建立了我所吸引的背景。这似乎通常是关心,但我很少会遇到这种失败。

这是 Xcode 5.1.1 附带的 iOS 7 模拟器。

4

1 回答 1

4

(最初,我认为这是对How can I fix CGContextRestoreGState: invalid context 0x0的欺骗。事实并非如此;消息是不同的,而且这个很容易解决。)

在发生此错误的情况下,newSizeaheight和/或width为 0(或负数)。

UIGraphicsBeginImageContextWithOptions在这种情况下失败,但它的形状不是可以返回错误的方式。(没有返回或结果。)因此,当您尝试在无法创建的上下文中绘制时,您将收到此错误。

要对此进行测试,请添加几行:

- (UIImage *)myImagePaddedToSize:(CGSize)newSize {
    NSParameterAssert(newSize.width > 0);
    NSParameterAssert(newSize.height > 0);
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);

试试看。我的猜测是它会在几分钟的测试中崩溃。

如果这确实是正在发生的事情,您将希望像这样进行永久性修复:

- (UIImage *)myImagePaddedToSize:(CGSize)newSize {
    if ((newSize.width <= 0) || (newSize.height <= 0)) {
        return nil;
    }
    UIGraphicsBeginImageContextWithOptions(newSize, NO, 0.0);

这个想法是你不能将图像填充到零或负大小,所以只需 return nil

于 2014-07-21T23:03:59.120 回答