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

Posted

技术标签:

【中文标题】iOS 7.0 下的无效上下文 0x0 和系统降级【英文标题】:invalid context 0x0 under iOS 7.0 and system degradation 【发布时间】:2013-11-05 03:04:24 【问题描述】:

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

【问题讨论】:

我们的应用程序中出现了同样的错误 - 来自表单上的标准文本框。如果您在键盘显示时多次点击文本框,则会出现此错误。 这里也一样。有时数百个这样的日志,有时为零。我认为这是因为我覆盖了 drawRect: 但它似乎是别的东西。暂时忽略它。 我刚刚完成了 developer.apple.com 上的第一个教程(复制 Apple 建议的代码),我得到了同样的错误。如果更有经验的程序员查看该教程,他们可能会找到导致此问题的原因。 见下文(在您使用自定义 UI 元素的视图中关闭自动布局) 2016 年仍然发生(XCode 7、iOS 9.2),仍然没有造成明显的伤害。 【参考方案1】:

如果您想知道是什么代码导致了这些日志,您可以在CGPostError 上add a symbolic breakpoint。

【讨论】:

感谢有关 CGPostError 的提示。我在上面放了一个断点,看起来我没有做任何事情来导致这个问题。就我而言,它发生在主线程上,但不在我的代码中。 投票赞成,因为尽管在这种特定情况下它不是解决方案,但当它在程序员自己的代码范围内时,它通常会突出错误所在。 这是一个很好的建议。对于那些不熟悉符号断点或如何在 Xcode 中添加它们的人,这里是 Apple 的文档。 developer.apple.com/library/ios/recipes/… 这对我有帮助。就我而言,它突出显示了我在我的 OS X 应用程序的视图中添加 NSGradient。 我好像是在为某个视图设置框架之前画的,谢谢! :)【参考方案2】:

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

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

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

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

【讨论】:

您对这个 iOS 7 UITextField 错误是完全正确的。不过,一定要为它打开一个雷达(bugreport.apple.com)但不要太快假设这是这里的问题。由于它是自定义视图,因此值得首先研究@Rob 的观点。 这发生在我身上.. 我在 IB 上放置了一个 uitextfield,得到那个错误并且键盘没有出现.. 有什么解决方案吗?谢谢 @Frade 对我来说,尽管出现了严重的错误消息,但键盘出现并且应用程序正常运行。所以你可能还有一个问题。 我也有同样的问题。它也只发生在模拟器中,但我注意到,当我遇到错误时,我无法使用 Mac 键盘在模拟器中输入,我必须使用屏幕键盘,这非常令人沮丧。在我的应用程序中,我没有使用任何自定义视图,因此我从不手动创建或使用 CG 上下文。 谢天谢地,我还以为是我的应用出了问题!不过,您是完全正确的;它是在一个文本字段中双击,这也对我造成了这个错误。【参考方案3】:

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

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

【讨论】:

我在调用drawRect的私有框架中有一个视图。虽然我没有直接调用任何提到的方法,但我唯一的假设是该类中的代码在某种程度上是相关的。然而,就像我提到的,在以前的 iOS 下一切都运行顺利。 为了完成(这是谷歌的最高结果),我想指出 OSX 10.11.3 上的神秘错误没有改变 - 正如 Rob 所说,由于有一个在 drawRect 或其他与上下文相关的函数之外的绘图函数。【参考方案4】:
UIGraphicsBeginImageContext( size );
CGContextRef context = UIGraphicsGetCurrentContext();

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

你可以在 CGPostError 中添加符号断点来检查

【讨论】:

所以……在 CGPostError 处添加一个符号断点,如何查看该点的大小? 可以通过command+6查看“显示调试导航”中的函数调用栈。然后你点击树,然后你可以回到你的函数来查看变量。 是的,我通过 imageview 使 imagview 成为圆形,但是,发现它的大小为零。 2天后终于解决了:D。【参考方案5】:

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

只要做:

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

问题应该不存在了

【讨论】:

【参考方案6】:

在我的情况下,我在这段代码中遇到了这些错误:

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

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

【讨论】:

【参考方案7】:

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

    #import <QuartzCore/QuartzCore.h>

【讨论】:

【参考方案8】:

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

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

【讨论】:

【参考方案9】:

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

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

【讨论】:

【参考方案10】:

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

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

    不要直接调用drawRect:,使用[view setNeedsDisplay]或者如果你需要立即绘图使用[view.layer draw] 在您的drawRect: 中获取上下文,但不要在此 if 语句 if (context) &lt;do drawing here&gt; 的主体之外使用它

【讨论】:

【参考方案11】:

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

【讨论】:

【参考方案12】:

在某些情况下,您可能需要包含 #import &lt;QuartzCore/QuartzCore.h&gt; 行。

【讨论】:

【参考方案13】:

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

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

这是最终与我的内联 cmets 一起工作的代码(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()

【讨论】:

【参考方案14】:

在我的情况下,我在创建带有帽子插图的可修复图像时遇到了这个警告。问题是我没有在“无上限”区域留下至少 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 个图像可以拉伸的区域【参考方案15】:

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

UIGraphicsBeginImageContext(大小); CGContextRef 上下文 = UIGraphicsGetCurrentContext(); CGContextSetFillColorWithColor(context, color.CGColor); CGContextFillRect(context, (CGRect).size = size); UIImage *image = UIGraphicsGetImageFromCurrentImageContext(); UIGraphicsEndImageContext();

因此我得到了错误。

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

【讨论】:

那有什么解决办法? @Geek,更新的解决方案。删除 DerivedData 内容并重新启动。【参考方案16】:

我也有同样的问题。 在我的项目中,我尝试创建一个 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】:

我收到了代码错误

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

世界变得安静

【讨论】:

【参考方案18】:

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

【讨论】:

【参考方案19】:

因为我设置了这个错误

textfield.delegate = self

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

【讨论】:

【参考方案20】:

当我在一个只有占位符文本的空白字段上进行触摸时,我在 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

【讨论】:

【参考方案21】:

对我来说,我收到此错误是因为我正在释放 CGContextRef,如下所示:

- (void)drawRect:(CGRect)rect

    CGContextRef context = UIGraphicsGetCurrentContext();

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

//    CGContextRelease(context);

删除版本解决了问题

【讨论】:

【参考方案22】:

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

- (UIImage *)activityImage

    return [UIImage imageNamed:@"img.png"];

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

【讨论】:

【参考方案23】:

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

【讨论】:

【参考方案24】:

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

在空白文本字段上:双击、长按、长按。

这似乎只影响 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 不会受到影响。

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

【讨论】:

【参考方案25】:

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

【讨论】:

【参考方案26】:

这很老套,但对我有用。

我在UITableViewCellinit中设置了UIImageView,给它一个大小和约束。

然后在我的视图控制器的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 设置实际图像。上面的代码是一个很好的默认代码

【讨论】:

以上是关于iOS 7.0 下的无效上下文 0x0 和系统降级的主要内容,如果未能解决你的问题,请参考以下文章

iOS 错误 - CGContextRestoreGState:无效上下文 0x0

关闭 UIImageView 时上下文 0x0 无效

为啥我在基于文档的应用程序中收到无效上下文 0x0 错误?

CGContextDrawImage:加载灰度图像时上下文 0x0 无效

<错误>:CGContextSaveGState:无效上下文 0x0 错误

UITextField 上的无效上下文 0x0 (Xcode 5)