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

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

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

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

任何人都可以指出我正确的方向? 我有一种感觉,我打电话给某些方法错误或不好的背景下,但从Xcode的输出在这一点上是不是很有帮助。

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

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

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

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

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

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

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

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

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

编辑#1:我有权访问正在导入的框架,但我没有看到任何奇怪的类导致问题。

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

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

在很多情况下,我很难认真对待无效的上下文0x0错误信息。 我不知道你的情况是否值得担忧(我同意Rob Napier说这是值得研究的,特别是如果你明确使用graphics上下文的话)。

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

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

如果您好奇什么代码导致这些日志,您可以在CGPostError上添加一个符号断点 。

这些types的错误在历史上是在不是在drawRectbuild立的上下文中,或者在诸如UIGraphicsBeginImageContextUIGraphicsEndImageContext (或者其他开始和结束上下文的UIKit函数)之类的调用之间调用Core Graphics函数的结果。

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

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

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

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

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

做就是了:

点击iOS模拟器>重置内容和设置…并再次运行。

问题不应该在那里了

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

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

经过一番思考和testing,我发现问题 – 这是这个电话:

 [path fill]; 

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

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

  #import <QuartzCore/QuartzCore.h> 

我得到这个错误,因为我正在使用一个UIColor对象作为在CATextLayer对象中使用的NSAttributedString字典中的属性。 我改变了字典来保存一个CGColorRef,错误消失了。

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

直接答案:问题是因为你已经使用核心graphics元素,如CGContext等- (void)drawRect:(CGRect)rect这个方法。

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

我已经有从UIGraphicsGetCurrentContext()返回的上下文的情况下,如果你尝试使用它的任何东西这个消息出现。 在调用drawRect:之前,使用UIGraphicsPushContext推送上下文是视图的责任,如果直接调用drawRect:而不是[view setNeedsDisplay] ,则可能会导致未设置上下文。 我的直觉是,在iOS 7之前,上下文被推到了init的视图上,现在在iOS 7上,在第一次drawRect:即将被调用之前,上下文不会被推送。 我怀疑一些UIKit代码直接调用drawRect:这就是为什么有些代码有问题,即使没有自定义绘图正在完成。

解决scheme(如果做自定义绘图):

  1. 不要直接调用drawRect:使用[view setNeedsDisplay]或者如果你需要立即使用绘图[view.layer draw]
  2. drawRect:获取上下文,但不要在if语句的主体之外使用if (context) {<do drawing here>}

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

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

我在自定义CALayer实现的drawInContext(..)方法中出现了这个错误。 UIBezierPath尝试使用UIGraphicsGetCurrentContext(),默认情况下在自定义图层中为零。 在线文档非常清楚地解释了这一点 –

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

这里的代码最终与我的意见内联(Swift代码,但解决scheme是相同的,无论)

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

在我的情况下,我创build一个带有图标的图像时发生了这个警告。 问题是我没有在“不加盖”的区域留下至less1个像素。

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

我使用下面的代码从上下文创buildUIImage:

     UIGraphicsBeginImageContext(大小);
     CGContextRef context = UIGraphicsGetCurrentContext();

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

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

因此我得到了错误。

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

我有同样的问题。 在我的项目中,我尝试创build一个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解决scheme不起作用 。 并感谢帮手。

我得到了错误的代码

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

世界变得沉默

对我来说,答案是我不必要地释放drawRect:的graphics上下文drawRect: 。 抛出CGPostError的符号断点指向我的罪魁祸首。

得到这个错误,因为我已经设置

 textfield.delegate = self 

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

我在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 } 

对我来说,我得到这个错误,因为我正在释放的CGContextRef如下所示:

 - (void)drawRect:(CGRect)rect { CGContextRef context = UIGraphicsGetCurrentContext(); // DRAW BACKGROUND CIRCLE CGContextSetFillColorWithColor(context, [[UIColor gray] colorWithAlphaComponent:0.6].CGColor); CGContextFillEllipseInRect(context, rect); // CGContextRelease(context); } 

删除发布解决了这个问题

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

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

input正确的图像为我解决了它。

从模拟器卸载应用程序,然后重新运行

和其他在这里评论过的人一样,当我做了以下任何一件事情时,我都得到了这个警告:

在空白文本框中:双击,轻触并按住长按一下。

这似乎只影响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模拟器中testing了这一点,不再收到警告。 我也在iPhone 6和iOS 6的iOS 8模拟器中testing了这一点,但我不相信iOS 8会受到影响。

经历了两天的挫折,才发现这个工作,所以我真的希望我的回答可以帮助那些有同样问题的人。

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