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
内建立的上下文中或在 UIGraphicsBeginImageContext
和 UIGraphicsEndImageContext
等调用之间(或其他 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) <do drawing here>
的主体之外使用它
【讨论】:
【参考方案11】:在受影响的视图中关闭自动布局会导致在某些情况下,当您在视图中放置和移动 UI 元素(尤其是以编程方式绘制的自定义元素)时,此错误会消失。当我发现这个症状时,我正在使用 JVFloatLabeledTextField。
【讨论】:
【参考方案12】:在某些情况下,您可能需要包含 #import <QuartzCore/QuartzCore.h>
行。
【讨论】:
【参考方案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】:这很老套,但对我有用。
我在UITableViewCell
的init
中设置了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
CGContextDrawImage:加载灰度图像时上下文 0x0 无效