iOS 7.0下无效的上下文0x0和系统降级


218

不幸的是,我已经阅读了尽可能多的搜索结果,不幸的是,每个搜索结果似乎都专注于特定的函数调用。

我的问题是,我从多个函数中得到了相同的错误,我猜这是从我使用的函数中回调的。

更糟糕的是,实际的代码在一个自定义的私有框架内,该框架正在另一个项目中导入,因此调试不是那么简单吗?

谁能指出我正确的方向?我感觉我在错误地或在错误的上下文中调用了某些方法,但是此时xcode的输出不是很有帮助。

:CGContextSetFillColorWithColor:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性整体下降。此通知是礼貌的:请解决此问题。在即将进行的更新中,它将成为致命错误。

:CGContextSetStrokeColorWithColor:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性整体下降。此通知是礼貌的:请解决此问题。在即将进行的更新中,它将成为致命错误。

CGContextSaveGState:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性整体下降。此通知是礼貌的:请解决此问题。在即将进行的更新中,它将成为致命错误。

:CGContextSetFlatness:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性整体下降。此通知是礼貌的:请解决此问题。在即将进行的更新中,它将成为致命错误。

:CGContextAddPath:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性整体下降。此通知是礼貌的:请解决此问题。在即将进行的更新中,它将成为致命错误。

:CGContextDrawPath:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性整体下降。此通知是礼貌的:请解决此问题。在即将进行的更新中,它将成为致命错误。

:CGContextRestoreGState:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性整体下降。此通知是礼貌的:请解决此问题。在即将进行的更新中,它将成为致命错误。

:CGContextGetBlendMode:无效的上下文0x0。这是一个严重的错误。该应用程序或其使用的库正在使用无效的上下文,从而导致系统稳定性和可靠性整体下降。此通知是礼貌的:请解决此问题。在即将进行的更新中,它将成为致命错误。

当显示自定义视图或其继承的类之一时,可能会发生这些错误。此时它们会产生多次,直到键盘不提供任何输入为止。触摸事件仍然被记录,但是系统速度变慢,最终可能导致未分配的对象错误。

编辑#1:我确实可以访问要导入的框架,但是在导致问题的类中看不到任何奇怪的东西。

编辑2:我刚刚收到一封电子邮件,称iOS 7.1已为开发人员发布。我很好奇,看看情况是否会消失,变得更糟或可以解决。


8
我们在应用中遇到了同样的错误-表单上的标准文本框。如果在键盘显示时多次单击文本框,则会出现此错误。

同样在这里。有时数百个这样的日志,有时为零。我以为是因为我要重写drawRect:但这似乎是另外一回事了。现在忽略它。
Krumelur'2

2
我刚刚完成了developer.apple.com上的第一个教程(复制了Apple建议的代码),并且遇到了同样的错误。也许如果经验丰富的程序员看了该教程,他们就能找到导致该问题的原因。
Antonio Sesto 2014年

1
参见下文(在使用自定义UI元素的视图中关闭自动布局)
JuJoDi 2014年

1
在2016年仍然会发生(XCode 7,iOS 9.2),仍然没有明显的危害。
Hatchmaster J

Answers:


162

其他人会要求您将代码发布到您访问核心图形上下文的位置,但是我怀疑这是问题所在。这些无效的上下文0x0错误消息是常见的,并且易于在iOS 7中重现。实际上,我可以使用零代码的情节提要重现该错误。我将UITextField拖到IB中的画布上,运行应用程序,然后在文本字段内双击。

在许多情况下,我很难认真对待无效的上下文0x0错误消息。我不知道您的情况是否值得引起更大的关注(我同意Rob Napier的观点,值得调查,尤其是在您明确使用图形上下文的情况下)。

在我自己的项目中,我希望这些错误有一天会神奇地消失(但是那天并没有包含7.0.3)。

更新:安装Xcode 5.1并定位到iOS 7.1之后,我无法再通过在空白文本字段中双击来重现该错误。


10
您对这个iOS 7 UITextField错误完全正确。虽然一定要为此打开雷达(bugreport.apple.com),但是不要太快就以为是这里的问题。由于这是一个自定义视图,因此值得首先研究@Rob的观点。
罗布·纳皮尔

2
这是发生在我身上。我在IB上放了一个uitextfield,得到了这个错误并且键盘没有出现..有什么解决方案吗?谢谢
Frade 2013年

@Frade对我来说,尽管出现了严重的错误消息,键盘仍会出现并且应用程序可以正常运行。因此,您可能还有其他问题。
bilobatum

3
我也有同样的问题。它也只会在模拟器中发生,但是我注意到,当我遇到错误时,我无法使用Mac键盘输入模拟器,而不得不使用屏幕键盘,这非常令人沮丧。在我的应用程序中,我没有使用任何自定义视图,因此我从不手动创建或使用CG上下文。

1
谢天谢地,我以为是我的应用有问题!你是完全正确的。双击一个文本字段也对我造成了此错误。
2013年

201

如果你想知道什么样的代码是导致这些日志,你可以添加一个象征性的断点CGPostError


2
感谢您提供有关CGPostError的技巧。我在上面设置了一个断点,看来我没有做任何导致该问题的事情。就我而言,这是在主线程上发生的,而不是在我的代码中发生的。
Paul Heller

10
之所以这样说是因为,尽管在特定情况下这不是解决方案,但当它在程序员自己的代码范围内时,它通常会突出显示错误所在。
灰烬

27
这是一个很好的建议。对于不熟悉符号断点或如何在Xcode中添加断点的用户,请参阅Apple的文档。developer.apple.com/library/ios/recipes/...
托尼·亚当斯

这对我有帮助。就我而言,它突出显示了我向OS X应用程序上的视图添加NSGradient的过程。
亚伦·维格2014年

1
看来我在为特定视图设置框架之前正在画画,谢谢!:)
里克·范德·林德

42

从历史上看,这类错误是由于不在drawRect诸如UIGraphicsBeginImageContext和和UIGraphicsEndImageContext(或其他UIKit函数,如开始和结束上下文的调用)之内或之间建立的上下文中调用Core Graphics函数而导致的。

话虽如此,但是bilobatum是正确的,这种特定的错误序列可能是他在回答中引用的那个iOS 7错误的结果。如果在您的iOS6目标中没有看到这些错误,或者在快速扫描此私有框架后没有找到任何可疑的Core Graphics调用,则可能只是此iOS 7错误。好收成,大叶!


我确实在调用drawRect的私有框架中有一个视图。尽管我没有直接调用任何上述方法,但我唯一的假设是该类中的代码以某种方式相关。但是,就像我提到的那样,在以前的iOS平台上,一切都可以顺利运行。
Ælex

为了完整起见(这是Google的最佳搜索结果),我想指出的是,在OSX 10.11.3上,隐式错误未更改-正如Rob所说,是由于在drawRect或其他上下文之外具有绘图功能引起的-相关功能。
green_knight,2016年

26
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

确保size.width或size.height不为0,

您可以将符号断点添加到CGPostError进行检查


所以……在CGPostError处添加了一个符号断点,如何看待这一点的大小?
Cris 2014年

您可以通过Command + 6在“显示调试导航”中查看函数调用堆栈。然后单击树,然后可以返回到函数以查看变量。
lbsweek,2014年

是的,我通过了imageview使该imagview变为圆形,但是,发现它的大小为零。终于在2天后解决了:D。
JiteshW


16

就我而言,我在以下代码中遇到了以下错误:

CAShapeLayer *shapeLayer = [CAShapeLayer layer];
UIBezierPath *path;

path = [UIBezierPath bezierPath];
[path moveToPoint:CGPointMake(0, 0)];
[path addLineToPoint:CGPointMake(size*2, 0)];
[path addLineToPoint:CGPointMake(size, size*2)];
[path closePath];
[path fill];

shapeLayer.path = path.CGPath;
shapeLayer.strokeColor = [[UIColor blackColor] CGColor];
shapeLayer.fillColor = color;
shapeLayer.lineWidth = width;

[self addSublayer:shapeLayer];

经过一番思考和测试,我发现了问题-就是这个电话:

[path fill];

正如我检测到的那样-在我的代码中此调用不是必需的,因为填充将通过其他方式完成-因此我将其删除。


5

我遇到了同样的问题,我忘记了导入QuartzCore / QuartzCore.h,这解决了这些错误。

    #import <QuartzCore/QuartzCore.h>

5

直截了当的回答: 问题是因为除了- (void)drawRect:(CGRect)rect此方法之外,您还使用了诸如CGContext之类的Core图形元素。

现在,请将您的代码移至该方法。它将给您警告/错误。


4

我收到此错误是因为我将UIColor对象用作CATextLayer对象中使用的NSAttributedString字典中的属性。我更改了字典以容纳CGColorRef,错误消失了。

[wordAttributes setObject:(id)[UIColor whiteColor].CGColor forKey:(NSString*)kCTForegroundColorAttributeName];

2

在某些情况下,从返回的上下文UIGraphicsGetCurrentContext()NULL,如果您尝试将其用于任何内容,则会出现此消息。如果直接调用而不是冒着尚未设置上下文的风险,则视图有责任UIGraphicsPushContext在调用之前使用推送上下文。我的直觉是,在iOS 7之前,上下文是在上推送视图的,而在iOS 7 上,直到第一次调用该上下文时才推送上下文。我怀疑某些UIKit代码正在直接调用,这就是为什么即使没有完成自定义绘制时某些代码也存在问题的原因。drawRect:drawRect:[view setNeedsDisplay]initdrawRect:drawRect:

解决方案(如果进行自定义绘图):

  1. 不要drawRect:直接打电话,使用,[view setNeedsDisplay]或者如果您需要立即使用图纸[view.layer draw]
  2. 在您drawRect:的上下文中,但不要在if语句之外使用它if (context) {<do drawing here>}

2

在某些情况下,当您在视图中放置和移动UI元素(尤其是以编程方式绘制的自定义元素)时,在受影响的视图中关闭自动布局会导致此错误消失。发现此症状时,我正在使用JVFloatLabeledTextField。


2

在某些情况下,您可能需要包括该行#import <QuartzCore/QuartzCore.h>


2

我的自定义CALayer实现的drawInContext(..)方法中出现此错误。UIBezierPath尝试使用UIGraphicsGetCurrentContext()(在自定义层中默认为nil)。该在线文档解释得很清楚-

但是,如果未使用UIView对象绘制图形,则必须使用UIGraphicsPushContext函数将有效上下文手动推入堆栈。

这是最终与我的内联注释一起使用的代码(快速代码,但是无论如何解决方案都是相同的)

override func drawInContext(ctx: CGContext!) {  
    var path = UIBezierPath()

    // 1. Make sure you push the CGContext that was first passed into you.
    UIGraphicsPushContext(ctx)
    path.moveToPoint(CGPoint(x: 0, y: 0))
    path.addLineToPoint(CGPoint(x: 150, y: 150))
    var lineColor = UIColor.blueColor()
    lineColor.setStroke()
    path.lineWidth = 2
    path.stroke(
    // 2. Pop the context after you are done.
    UIGraphicsPopContext()
}

2

以我为例,在创建带有盖帽插图的可修复图像时出现此警告。问题是我没有在“未封顶”区域中保留至少1个像素。

    UIImage *image = [UIImage imageNamed:@"name"];
    UIEdgeInsets edgeInsets = UIEdgeInsetsMake(20, 10, 20, 10);  //Problem here if the width is 20 or the height is 40
    image = [image resizableImageWithCapInsets:edgeInsets];

1
有完全一样的问题。显然,您必须至少保留图像可以拉伸的区域1点
ribeto

1

我正在使用以下代码从上下文创建UIImage:

    UIGraphicsBeginImageContext(size);
    CGContextRef context = UIGraphicsGetCurrentContext();

    CGContextSetFillColorWithColor(context,color.CGColor);
    CGContextFillRect(context,(CGRect){。size = size});

    UIImage * image = UIGraphicsGetImageFromCurrentImageContext();
    UIGraphicsEndImageContext();

因此,我得到了错误。

所以我删除了Derived Data内容,重新启动了XCode。而且有效。


那有什么解决办法呢?
极客2014年

1
@Geek,更新的解决方案。删除DerivedData内容并重新启动。
2014年

1

我也有同样的问题。在我的项目中,我尝试创建一个textField并将其添加到我的pdf文件中。旧代码:

- (void) drawInContext:(CGContextRef)context {
    //Otherwise we're upside-down
    CGContextSetTextMatrix(context, CGAffineTransformMake(1.0,0.0, 0.0, -1.0, 0.0, 0.0));

    CGContextSetTextDrawingMode(context, kCGTextFill); // This is the default
    [[UIColor blackColor] setFill]; // ***This is the problem ***

    CGFloat x = self.rect.origin.x;
    CGFloat y = self.rect.origin.y + self.font.pointSize;
    [self.text drawAtPoint:CGPointMake(x, y)
            withAttributes:@{NSFontAttributeName:[UIFont fontWithName:@"Arial" size:12]}];
}

解决此问题后,代码更改为:

old:[[UIColor blackColor] setFill]; 

new:CGContextSetFillColorWithColor(context, [[UIColor blackColor] CGColor]);

我发现UIColor SetFill上的解决方案不起作用。并感谢助手。


1

我的代码有错误

UIBezierPath *path = [UIBezierPath bezierPath];
[path moveToPoint:pointA];
[path addLineToPoint:pointB];
[path addLineToPoint:pointC];
[[UIColor colorWithHexString:@"EFEFEF"] set];
[path fill];
[path closePath];

CAShapeLayer *triangle = [CAShapeLayer layer];
triangle.fillColor = [UIColor colorWithHexString:@"EFEFEF"].CGColor;
triangle.path = path.CGPath;

return triangle;

然后删除代码

[[UIColor colorWithHexString:@"EFEFEF"] set];
[path fill];

世界变得沉默



0

像我设置的那样得到了这个错误

textfield.delegate = self

没有实现任何委托例程。删除那条线为我解决了问题


0

当我仅使用占位符文本的空白字段上进行触摸时,我在UITextField中遇到此问题。我使用以下变通办法来消除空白字段:

-(void)textFieldDidBeginEditing:(UITextField *)textField{

        textField.text=[@" " stringByAppendingString:textField.text];

        //other stuff here
}


-(BOOL)textFieldShouldReturn:(UITextField *)textField{

         if(textField.text.length>0){
             if([[textField.text substringToIndex:1] isEqualToString:@" "])
                 textField.text=[textField.text substringFromIndex:1];
         }
         //  other stuff here
}

0

对我来说,出现此错误是因为我释放了CGContextRef,如下所示:

- (void)drawRect:(CGRect)rect
{
    CGContextRef context = UIGraphicsGetCurrentContext();

    // DRAW BACKGROUND CIRCLE
    CGContextSetFillColorWithColor(context, [[UIColor gray] colorWithAlphaComponent:0.6].CGColor);
    CGContextFillEllipseInRect(context, rect);

//    CGContextRelease(context);
}

删除发行版解决了该问题


0

当我在UIActivity子类的activityImage方法中错误键入图像名称时得到了它

- (UIImage *)activityImage
{
    return [UIImage imageNamed:@"img.png"];
}

输入正确的图像为我解决了。


0

从模拟器卸载应用程序,然后再次运行


0

像在这里发表评论的其他人一样,当我执行以下任一操作时,我也会收到此警告:

在空白文本字段上:点按两次,触摸并按住,长按一次。

这似乎只影响iOS 7.0.3

我发现了一种解决方法,如果您的粘贴板不为NULL,则不会触发警告。

所以我在textFieldDidBeginEditing中做了以下工作:

- (void)textFieldDidBeginEditing:(UITextField *)textField {

    UIPasteboard *pasteboard = [UIPasteboard generalPasteboard];
    if (pasteboard.string.length == 0) {

        pasteboard.string = @" ";

    }
}

我在iPhone 4s,5和5s的iOS 7.0.3模拟器中对此进行了测试,不再收到警告。我还在iphone 6和6 plus上的iOS 8模拟器中对此进行了测试,但我认为iOS 8不会受到影响。

经过两天的挫折后才发现可以解决的问题,因此我真的希望我的回答对遇到同样问题的人们有所帮助。


0

如果在使用UIBezierPath并为笔触或填充设置颜色时发生错误,请将设置的颜色代码放入drawRect函数而不是其他位置。


0

这很骇人,但对我有用。

我成立UIImageViewUITableViewCellinit,给它一个尺寸和约束。

然后在我的视图控制器中cellForRowAtIndexPath执行此操作:

let img = PFImageView(frame: CGRect(x: 0, y: 0, width: 50, height: 50))
img.setImage(withFile: nil, defaultText: message.senderUsername)
cell.profileImageView?.image = img.image

这样可以避免错误,然后在函数的下面设置该图像的实际图像UIImageView。上面的代码是一个很好的默认值

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.