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

时间:2013-10-25 20:53:19

标签: objective-c ios7 core-graphics

我已经阅读了很多关于这个可怕问题的搜索结果,不幸的是,每个人似乎都专注于特定的函数调用。

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

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

有人能指出我正确的方向吗?我有一种感觉我错误地调用某些方法或者上下文不好,但是xcode的输出在这一点上并没有很大帮助。

  

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

     

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

     

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

     

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

     

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

     

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

     

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

     

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

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

编辑#1:我确实可以访问正在导入的框架,但是我没有在导致问题的类中看到任何奇怪的内容。

编辑#2:我刚刚收到一封发送给iOS 7.1的电子邮件。我很想知道这是否会消失,或者变得更糟,或者可以解决。

26 个答案:

答案 0 :(得分:200)

如果您对导致这些日志的代码感到好奇,可以在CGPostErroradd a symbolic breakpoint

答案 1 :(得分:162)

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

在许多情况下,我很难认真对待无效的上下文0x0错误消息。我不知道你的情况是否值得更加关注(我同意Rob Napier的说法值得调查,特别是如果你明确使用图形上下文的话)。

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

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

答案 2 :(得分:42)

这些类型的错误在历史上是在不在drawRect内建立的上下文中或在UIGraphicsBeginImageContextUIGraphicsEndImageContext之类的调用(或其他UIKit函数)之间调用Core Graphics函数的结果像开始和结束上下文的那样。)

尽管如此,bilobatum是正确的,这个特定的错误序列可能是他在答案中引用的iOS 7错误的结果。如果没有在你的iOS6目标中看到这些错误,或者在快速扫描这个私有框架之后你没有发现任何可疑的Core Graphics调用,那么它可能就是这个iOS 7错误。好的捕获,bilobatum!

答案 3 :(得分:26)

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

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

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

答案 4 :(得分:19)

我遇到了一个简单的UITextField问题(键盘没有显示,控制台上出现了许多不同的无效上下文错误消息)。 我只是通过查看SO上的另一个问题找到了解决方法:Cannot find executable for CFBundle CertUIFramework.axbundle

只是做:

  

点击iOS模拟器>重置内容和设置...然后重新运行。

问题不应再存在了

答案 5 :(得分: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];

当我检测到 - 在我的代码中,这个调用不是必需的,因为填充将通过其他方式完成 - 所以我只是删除它。

答案 6 :(得分:5)

直接答案: 问题是因为除了- (void)drawRect:(CGRect)rect这种方法之外,你已经使用了CGContext等核心图形元素。

现在请将您的代码移动到此方法。它会strop给你警告/错误。

答案 7 :(得分:5)

我有同样的问题,我忘了导入QuartzCore / QuartzCore.h,这解决了我的问题。

    #import <QuartzCore/QuartzCore.h>

答案 8 :(得分:4)

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

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

答案 9 :(得分:2)

在某些情况下,您可能需要添加第#import <QuartzCore/QuartzCore.h>行。

答案 10 :(得分:2)

我遇到过从UIGraphicsGetCurrentContext()返回的上下文为NULL的情况,如果您尝试将其用于此消息,则会出现此消息。视图有责任在调用UIGraphicsPushContext之前使用drawRect:推送上下文,如果您直接调用drawRect:而不是[view setNeedsDisplay],那么您可能无法设置上下文。我的预感是,在iOS 7之前,为init上的视图推送了上下文,现在在iOS 7上,直到第一次调用drawRect:时才会推送上下文。我怀疑一些UIKit代码直接调用drawRect:,这就是为什么即使没有自定义绘图也会出现某些代码的问题。

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

  1. 请勿直接致电drawRect:,使用[view setNeedsDisplay]或如果您需要立即使用图片[view.layer draw]
  2. drawRect:获取上下文但不要在if语句if (context) {<do drawing here>}
  3. 的正文之外使用它

答案 11 :(得分:2)

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

答案 12 :(得分:2)

我在自定义CALayer实现的drawInContext(..)方法中遇到此错误。 UIBezierPath尝试使用UIGraphicsGetCurrentContext(),默认情况下在自定义层中为零。 online documentation非常清楚地解释了这一点 -

  

但是,如果您没有使用UIView对象进行绘图,则必须使用UIGraphicsPushContext函数手动将有效上下文压入堆栈。

这里的代码最终与我的内联注释一致(Swift代码,但解决方案是相同的)

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()
}

答案 13 :(得分:2)

在我的情况下,当我创建一个带有cap insets的可靠图像时,我发出了这个警告。问题是我没有留下至少1个像素的&#34;无上限&#34;区域。

    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];

答案 14 :(得分: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];

世界变得沉默

答案 15 :(得分:1)

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

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

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

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

因此我收到了错误。

所以我删除了派生数据内容,重新启动了我的XCode。它起作用了。

答案 16 :(得分: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 doesn't work找到了解决方案。 谢谢你的帮助。

答案 17 :(得分:0)

从模拟器中卸载应用程序并再次运行

答案 18 :(得分:0)

这很骇人,但对我有用。

我在UIImageView的{​​{1}}中设置了UITableViewCell,并为其设置了大小和约束条件。

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

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 的实际图像。上面的代码是一个很好的默认

答案 19 :(得分:0)

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

答案 20 :(得分: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会受到影响。

在发现这项工作之前经历了两天的挫折,所以我真的希望我的回答可以帮助那些遇到同样问题的人。

答案 21 :(得分:0)

当我在UIActivity子类

中的activityImage方法中输入错误的图像名称时,我得到了它
- (UIImage *)activityImage
{
    return [UIImage imageNamed:@"img.png"];
}

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

答案 22 :(得分: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);
}

删除版本解决了问题

答案 23 :(得分:0)

因为我设置了

而出现此错误
textfield.delegate = self

不实现任何委托例程。删除该行解决了我的问题

答案 24 :(得分:0)

对我来说,答案是我在drawRect:中不必要地释放了图形上下文。在CGPostError上抛出一个符号断点让我指出了罪魁祸首。

答案 25 :(得分: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
}