219

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

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

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

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

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

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

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

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

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

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

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

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

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

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

编辑#2:我刚收到一封电子邮件,iOS 7.1 已经发布给开发者。我很好奇这是否会消失,或者变得更糟,或者可以解决。

4

26 回答 26

201

如果您好奇是什么代码导致了这些日志,您可以CGPostError.

于 2013-10-26T21:43:51.447 回答
162

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

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

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

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

于 2013-10-25T21:26:16.527 回答
42

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

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

于 2013-10-25T21:26:38.620 回答
26
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

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

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

于 2014-03-11T07:46:21.027 回答
19

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

做就是了:

单击 iOS Simulator > Reset Content and Settings... 并再次运行。

问题应该不存在了

于 2014-01-08T16:03:45.067 回答
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];

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

于 2013-12-03T06:50:40.070 回答
5

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

    #import <QuartzCore/QuartzCore.h>
于 2014-01-31T02:32:34.960 回答
5

直接回答:- (void)drawRect:(CGRect)rect问题是因为您在此方法 之外使用了 CGContext 等核心图形元素。

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

于 2015-05-14T06:49:28.607 回答
4

我收到此错误是因为我在 CATextLayer 对象中使用的 NSAttributedString 字典中使用 UIColor 对象作为属性。我更改了字典以保存 CGColorRef 并且错误消失了。

[wordAttributes setObject:(id)[UIColor whiteColor].CGColor forKey:(NSString*)kCTForegroundColorAttributeName];
于 2014-04-15T21:51:57.310 回答
2

我遇到过从UIGraphicsGetCurrentContext()is返回的上下文的情况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>}
于 2014-01-14T17:54:33.137 回答
2

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

于 2014-02-23T02:01:09.010 回答
2

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

于 2014-07-17T06:46:26.317 回答
2

我在自定义 CALayer 实现的 drawInContext(..) 方法中遇到了这个错误。UIBezierPath 尝试使用 UIGraphicsGetCurrentContext() 在自定义层中默认为 nil。在线文档非常清楚地解释了这一点-

但是,如果您不使用 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()
}
于 2015-01-16T18:59:43.313 回答
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];
于 2015-03-09T15:28:40.673 回答
1

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

    UIGraphicsBeginImageContext(大小);
    CGContextRef 上下文 = UIGraphicsGetCurrentContext();

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

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

因此我得到了错误。

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

于 2014-02-03T10:16:46.830 回答
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 的解决方案不起作用。并感谢帮手。

于 2014-12-03T07:41:18.127 回答
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];

世界变得安静

于 2016-03-23T08:27:13.130 回答
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
}
于 2014-02-17T09:03:52.840 回答
0

对我来说,答案是我在drawRect:. 在 CGPostError 上抛出一个符号断点将我指向了罪魁祸首。

于 2014-04-03T22:10:10.843 回答
0

正如我设置的那样得到这个错误

textfield.delegate = self

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

于 2014-04-15T06:03:30.187 回答
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);
}

删除版本解决了问题

于 2014-08-26T17:41:33.403 回答
0

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

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

输入正确的图像为我解决了这个问题。

于 2014-08-31T20:57:51.037 回答
0

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

于 2014-09-12T09:43:30.877 回答
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 不会受到影响。

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

于 2015-08-31T03:00:33.117 回答
0

如果在使用 UIBezierPath 并为描边或填充设置颜色时出现错误,请将设置的颜色代码放在 drawRect 函数中,而不是其他地方。

于 2016-07-04T03:42:18.340 回答
0

这很hacky,但对我有用。

UIImageViewUITableViewCell's中设置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

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

于 2018-09-05T15:17:33.550 回答