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的错误在历史上是在不是在drawRect
build立的上下文中,或者在诸如UIGraphicsBeginImageContext
和UIGraphicsEndImageContext
(或者其他开始和结束上下文的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(如果做自定义绘图):
- 不要直接调用
drawRect:
使用[view setNeedsDisplay]
或者如果你需要立即使用绘图[view.layer draw]
- 在
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函数中而不是其他位置。