如何设置 CG_CONTEXT_SHOW_BACKTRACE 环境变量?
Posted
技术标签:
【中文标题】如何设置 CG_CONTEXT_SHOW_BACKTRACE 环境变量?【英文标题】:How can I set CG_CONTEXT_SHOW_BACKTRACE environmental variable? 【发布时间】:2015-10-30 14:22:03 【问题描述】:我的视图中有三个按钮。在 viewDidLoad() 中设置cornerRadus 后:button.layer.cornerRadius = 20
我在日志中收到以下错误消息:
<Error>: CGContextSaveGState: invalid context 0x0.
If you want to see the backtrace, please set
CG_CONTEXT_SHOW_BACKTRACE environmental variable.
问题:
好的,我现在从消息中得到回溯。这对我来说没有任何意义。请帮忙...
Aug 7 14:27:00 <Error>: CGContextSaveGState: invalid context 0x0. Backtrace:
<-[UIStatusBarItemView updateContentsAndWidth]+33>
<-[UIStatusBarItemView initWithItem:data:actions:style:]+477>
<+[UIStatusBarItemView createViewForItem:withData:actions:foregroundStyle:]+134>
<-[UIStatusBarLayoutManager _createViewForItem:withData:actions:]+163>
<-[UIStatusBarLayoutManager _prepareEnabledItemType:withEnabledItems:withData:actions:itemAppearing:itemDisappearing:]+36
<-[UIStatusBarLayoutManager prepareEnabledItems:withData:actions:]+92>
<-[UIStatusBarForegroundView _setStatusBarData:actions:animated:]+797>
<-[UIStatusBarForegroundView setStatusBarData:actions:animated:]+332>
<__51-[UIStatusBar _prepareToSetStyle:animation:forced:]_block_invoke+360>
<+[UIView(Animation) performWithoutAnimation:]+65>
<-[UIStatusBar _prepareToSetStyle:animation:forced:]+866>
<-[UIStatusBar _requestStyleAttributes:animationParameters:forced:]+391>
<-[UIStatusBar requestStyle:animationParameters:forced:]+437>
<-[UIStatusBar requestStyle:animated:forced:]+90>
<-[UIStatusBar _evaluateServerRegistration]+250>
<__45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke+590>
<-[UIView(Hierarchy) _postMovedFromSuperview:]+544>
<-[UIView(Internal) _addSubview:positioned:relativeTo:]+1967>
<-[UIStatusBarWindow setStatusBar:]+288>
<-[UIApplication _createStatusBarWithRequestedStyle:orientation:hidden:]+340>
<-[UIApplication _runWithMainScene:transitionContext:completion:]+950>
<-[UIApplication workspaceDidEndTransaction:]+188>
<-[FBSSerialQueue _performNext]+192>
<-[FBSSerialQueue _performNextFromRunLoopSource]+45>
<__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__+17>
<__CFRunLoopDoSources0+556>
<__CFRunLoopRun+867>
<CFRunLoopRunSpecific+488>
<-[UIApplication _run]+402>
<UIApplicationMain+171>
<main+117>
Aug 7 14:27:00 <Error>: CGContextTranslateCTM: invalid context 0x0. Backtrace:
<-[UIStatusBarItemView updateContentsAndWidth]+33>
<-[UIStatusBarItemView initWithItem:data:actions:style:]+477>
<+[UIStatusBarItemView createViewForItem:withData:actions:foregroundStyle:]+134>
<-[UIStatusBarLayoutManager _createViewForItem:withData:actions:]+163>
<-[UIStatusBarLayoutManager _prepareEnabledItemType:withEnabledItems:withData:actions:itemAppearing:itemDisappearing:]+36
<-[UIStatusBarLayoutManager prepareEnabledItems:withData:actions:]+92>
<-[UIStatusBarForegroundView _setStatusBarData:actions:animated:]+797>
<-[UIStatusBarForegroundView setStatusBarData:actions:animated:]+332>
<__51-[UIStatusBar _prepareToSetStyle:animation:forced:]_block_invoke+360>
<+[UIView(Animation) performWithoutAnimation:]+65>
<-[UIStatusBar _prepareToSetStyle:animation:forced:]+866>
<-[UIStatusBar _requestStyleAttributes:animationParameters:forced:]+391>
<-[UIStatusBar requestStyle:animationParameters:forced:]+437>
<-[UIStatusBar requestStyle:animated:forced:]+90>
<-[UIStatusBar _evaluateServerRegistration]+250>
<__45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke+590>
<-[UIView(Hierarchy) _postMovedFromSuperview:]+544>
<-[UIView(Internal) _addSubview:positioned:relativeTo:]+1967>
<-[UIStatusBarWindow setStatusBar:]+288>
<-[UIApplication _createStatusBarWithRequestedStyle:orientation:hidden:]+340>
<-[UIApplication _runWithMainScene:transitionContext:completion:]+950>
<-[UIApplication workspaceDidEndTransaction:]+188>
<-[FBSSerialQueue _performNext]+192>
<-[FBSSerialQueue _performNextFromRunLoopSource]+45>
<__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__+17>
<__CFRunLoopDoSources0+556>
<__CFRunLoopRun+867>
<CFRunLoopRunSpecific+488>
<-[UIApplication _run]+402>
<UIApplicationMain+171>
<main+117>
Aug 7 14:27:00 <Error>: CGContextRestoreGState: invalid context 0x0. Backtrace:
<-[UIStatusBarItemView updateContentsAndWidth]+33>
<-[UIStatusBarItemView initWithItem:data:actions:style:]+477>
<+[UIStatusBarItemView createViewForItem:withData:actions:foregroundStyle:]+134>
<-[UIStatusBarLayoutManager _createViewForItem:withData:actions:]+163>
<-[UIStatusBarLayoutManager _prepareEnabledItemType:withEnabledItems:withData:actions:itemAppearing:itemDisappearing:]+36
<-[UIStatusBarLayoutManager prepareEnabledItems:withData:actions:]+92>
<-[UIStatusBarForegroundView _setStatusBarData:actions:animated:]+797>
<-[UIStatusBarForegroundView setStatusBarData:actions:animated:]+332>
<__51-[UIStatusBar _prepareToSetStyle:animation:forced:]_block_invoke+360>
<+[UIView(Animation) performWithoutAnimation:]+65>
<-[UIStatusBar _prepareToSetStyle:animation:forced:]+866>
<-[UIStatusBar _requestStyleAttributes:animationParameters:forced:]+391>
<-[UIStatusBar requestStyle:animationParameters:forced:]+437>
<-[UIStatusBar requestStyle:animated:forced:]+90>
<-[UIStatusBar _evaluateServerRegistration]+250>
<__45-[UIView(Hierarchy) _postMovedFromSuperview:]_block_invoke+590>
<-[UIView(Hierarchy) _postMovedFromSuperview:]+544>
<-[UIView(Internal) _addSubview:positioned:relativeTo:]+1967>
<-[UIStatusBarWindow setStatusBar:]+288>
<-[UIApplication _createStatusBarWithRequestedStyle:orientation:hidden:]+340>
<-[UIApplication _runWithMainScene:transitionContext:completion:]+950>
<-[UIApplication workspaceDidEndTransaction:]+188>
<-[FBSSerialQueue _performNext]+192>
<-[FBSSerialQueue _performNextFromRunLoopSource]+45>
<__CFRUNLOOP_IS_CALLING_OUT_TO_A_SOURCE0_PERFORM_FUNCTION__+17>
<__CFRunLoopDoSources0+556>
<__CFRunLoopRun+867>
<CFRunLoopRunSpecific+488>
<-[UIApplication _run]+402>
<UIApplicationMain+171>
<main+117>
【问题讨论】:
问题的标题和(编辑的)问题不匹配。 @utogaria 给了你原来的正确答案。 【参考方案1】:您可以通过此菜单设置环境变量:产品 -> 方案 -> 编辑方案。在“运行”项下,找到“参数”选项卡,您将在选项卡中看到“环境变量”,添加CG_CONTEXT_SHOW_BACKTRACE
并将其值设置为YES。
【讨论】:
谢谢,这显示了 CG Context 的总回溯......原来,它与我的按钮无关......它是 UIStatusBarItemView.. 您能否尝试再次检查您的 xib/storyboard 文件,看看是否为任何自定义 UIButton、UIBarButtonItem 等设置了任何背景图像。如果图像设置不正确(图像文件丢失等),它也可能像你一样产生警告。 双重检查..所有图像设置正确..它们都在 Assets.xcassets 我什至删除了按钮..同样的错误不断出现.. 您可以尝试另一件事。在 Xcode 中,转到“断点导航器”,然后添加一个“异常断点”。运行应用程序,看看它是否触发了任何异常断点。如果是这样,您也许能够更深入地了解发生了什么。 如果它工作,那么它是调试与UI部分相关的错误的一个很好的想法。【参考方案2】:这是 9b5 中的一个错误:https://forums.developer.apple.com/thread/13683
向 Apple 提交 RADAR。
【讨论】:
Xcode 7.0 (7A220) 中仍然存在这个错误。通过创建一个新的空项目并在 info.plist 中将 UIViewControllerBasedStatusBarAppearance 设置为 NO 可以轻松重现。 在上面提到的链接中,一位苹果工作人员刚刚回答:“确实,错误消息的根本原因是ios应用程序使用某些状态栏类型时出现的问题,例如隐藏。”,和“你可以忽略这个警告。” 我在iOS 9.2
和Xcode 7.2
下观察到同样的问题【参考方案3】:
这个问题发生在 Xcode 7 上。在我的例子中,我从 Info.plist
中删除了 UIViewControllerBasedStatusBarAppearance
,问题就解决了!请参阅此post 中的答案:
【讨论】:
您的解决方案也对我有用,但是,如果我希望 UIStatusbar 保持白色怎么办? 我不认为这是一个“修复”,因为我认为大多数设置UIViewControllerBasedStatusBarAppearance
的人只是因为他们需要它,但结果我错了,因为这个答案有 19 个赞成票:p跨度>
是的,我同意你的看法。我在此链接中找到了更改状态栏颜色的解决方案:***.com/a/32675066/1095530
这里不工作,有些人在 plist 中需要这个,因为以前隐藏状态栏的方法现在已弃用【参考方案4】:
在 Xcode 7 上:
如果您仍然希望隐藏状态栏,只需将Info.plist
文件中的UIViewControllerBasedStatusBarAppearance
更改为View controller-based status bar appearance
。别忘了设置NO
【讨论】:
这没有意义;UIViewControllerBaseStatusBarAppearance
和 View controller-based status bar appearance
在 Info.plist
上是同一个东西。一个是键值,另一个是面向用户的文本。以上是关于如何设置 CG_CONTEXT_SHOW_BACKTRACE 环境变量?的主要内容,如果未能解决你的问题,请参考以下文章