苹果开发初学者指南:Xcode 如何为运行的 App 添加环境变量(Environmental Variable)

在这里插入图片描述

概览

Xcode 15 在运行 SwiftUI 代码时突然报告如下警告:

Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem.

在这里插入图片描述

不仅如此,Xcode 调试控制台中还提示我们需要添加特定的环境变量以进一步与该错误“亲密接触”。可是我们应该如何添加环境变量呢?

在本篇博文中,您将学到如下内容:

  • 概览
  • 1. 事件始末
  • 2. 按部就班:增加运行时环境变量
  • 总结

相信学完本课后,头发茂密的小伙伴们会对 Xcode 中添加环境变量这一常规技能了然于胸、信手拈来!那还等什么呢?

Let‘s go!!!😉


博文对应的视频在此,请恣意观赏吧!

苹果开发初学者指南:Xcode 如何添加环境变量

1. 事件始末

在 Xcode 15.2 调试运行 SwiftUI(模拟器 iOS 版本 17.2)编写的应用时,出现了如下错误信息:

在这里插入图片描述

可以看到该“错误”的描述相当模棱两可,既无法意会,也不方便言传:“该应用程序或库向 CoreGraphics 接口传入了一个非法的数字值(NaN 或根本不是数字)”,这是个啥意思?

“肿”么会这样?难道源代码是外星人写的?

import SwiftUIstruct ContentView: View {@State var name = ""var body: some View {        VStack {TextField("", text: $name).textFieldStyle(.roundedBorder)}.padding()}
}#Preview {ContentView()
}

如上我们可以看到,源代码简单的不要不要的,并没有什么特别的地方:我们只是用一个其貌不扬的 TextField 来捕获用户的输入而已。

在这里插入图片描述

另外我们还注意到该错误在 Xcode 预览中并不会出现,只会在真机或模拟器上运行时才会“面目狰狞”。

2. 按部就班:增加运行时环境变量

如果小伙伴们仔细观察就会发现,该错误只是其一,实际上 Apple 在该错误之后立马就给出了进一步探查它的方法:

If you want to see the backtrace, please set CG_NUMERICS_SHOW_BACKTRACE environmental variable.

“如果想看到回溯(backtrace)信息,请设置 CG_NUMERICS_SHOW_BACKTRACE 环境变量”(这里的回溯应该是出现该问题时的栈回溯)

那么如何设置这一环境变量呢?

首先,在 Xcode 中编辑项目的 Scheme 配置:

在这里插入图片描述

接着选择 Run 配置中的 Arguments 选项卡,我们即可轻车熟路的如愿添加指定的环境变量了:

在这里插入图片描述

注意,它只要我们添加一个名为 CG_NUMERICS_SHOW_BACKTRACE 的环境变量,至于它的值是啥并没有什么毛线关系,实际上只要这个变量存在就可以了,如上图演示的那样我们没有为它设置任何值。

再次运行原先的代码,我们发现了“新大陆”:

Backtrace:<CGPathMoveToPoint+84><+[UIBezierPath _continuousRoundedRectBezierPath:withRoundedCorners:cornerRadii:segments:smoothPillShapes:]+1120><+[UIBezierPath _continuousRoundedRectBezierPath:withRoundedCorners:cornerRadius:segments:]+180><+[UIBezierPath _roundedRectBezierPath:withRoundedCorners:cornerRadius:segments:legacyCorners:]+340><-[_UITextChoiceAccelerationBubble backgroundImageView]+156><-[_UITextChoiceAccelerationBubble anchorToTextIfNeeded]+500><-[_UITextChoiceAccelerationBubble updateTextAnchorForParentView:]+156><-[_UITextChoiceAccelerationBubble updateTextBoxHighlightForRect:inTextView:parentView:highlightColor:]+88><-[_UITextChoiceAccelerationAssistant updateActivePromptForCandidate:displayRects:highlightOnly:]+352><-[UIKeyboardImpl updateAutocorrectPrompt:correctionRects:]+492><-[UIKeyboardImpl updateAutocorrectPrompt:executionContext:]+608><__45-[UIKeyboardImpl touchAutocorrectPromptTimer]_block_invoke+112><__56-[UIKeyboardScheduledTask handleDeferredTimerFiredEvent]_block_invoke+184><-[UIKeyboardTaskEntry execute:]+200><-[UIKeyboardTaskQueue continueExecutionOnMainThread]+304><-[UIKeyboardTaskQueue addTask:]+92><-[UIKeyboardScheduledTask handleDeferredTimerFiredEvent]+216><__invoking___+144><-[NSInvocation invoke]+276><-[_UIActionWhenIdle invoke]+52><__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__+32><__CFRunLoopDoObservers+528><__CFRunLoopRun+968><CFRunLoopRunSpecific+572><GSEventRunModal+160><-[UIApplication _run]+868><UIApplicationMain+124><OUTLINED_FUNCTION_70+500><OUTLINED_FUNCTION_70+148><OUTLINED_FUNCTION_2+92><$s4test0A3AppV5$mainyyFZ+40><main+12>1022215441022ca0e0                                    487a800000000000
Error: this application, or a library it uses, has passed an invalid numeric value (NaN, or not-a-number) to CoreGraphics API and this value is being ignored. Please fix this problem.
Backtrace:<CGPathAddLineToPoint+88><+[UIBezierPath _continuousRoundedRectBezierPath:withRoundedCorners:cornerRadii:segments:smoothPillShapes:]+1140><+[UIBezierPath _continuousRoundedRectBezierPath:withRoundedCorners:cornerRadius:segments:]+180><+[UIBezierPath _roundedRectBezierPath:withRoundedCorners:cornerRadius:segments:legacyCorners:]+340><-[_UITextChoiceAccelerationBubble backgroundImageView]+156><-[_UITextChoiceAccelerationBubble anchorToTextIfNeeded]+500><-[_UITextChoiceAccelerationBubble updateTextAnchorForParentView:]+156><-[_UITextChoiceAccelerationBubble updateTextBoxHighlightForRect:inTextView:parentView:highlightColor:]+88><-[_UITextChoiceAccelerationAssistant updateActivePromptForCandidate:displayRects:highlightOnly:]+352><-[UIKeyboardImpl updateAutocorrectPrompt:correctionRects:]+492><-[UIKeyboardImpl updateAutocorrectPrompt:executionContext:]+608><__45-[UIKeyboardImpl touchAutocorrectPromptTimer]_block_invoke+112><__56-[UIKeyboardScheduledTask handleDeferredTimerFiredEvent]_block_invoke+184><-[UIKeyboardTaskEntry execute:]+200><-[UIKeyboardTaskQueue continueExecutionOnMainThread]+304><-[UIKeyboardTaskQueue addTask:]+92><-[UIKeyboardScheduledTask handleDeferredTimerFiredEvent]+216><__invoking___+144><-[NSInvocation invoke]+276><-[_UIActionWhenIdle invoke]+52><__CFRUNLOOP_IS_CALLING_OUT_TO_AN_OBSERVER_CALLBACK_FUNCTION__+32><__CFRunLoopDoObservers+528><__CFRunLoopRun+968><CFRunLoopRunSpecific+572><GSEventRunModal+160><-[UIApplication _run]+868><UIApplicationMain+124><OUTLINED_FUNCTION_70+500><OUTLINED_FUNCTION_70+148><OUTLINED_FUNCTION_2+92><$s4test0A3AppV5$mainyyFZ+40><main+12>1022215441022ca0e0                                    487a800000000000

看来貌似是 CoreGraphics 在绘制圆角矩形时收到了某个“调皮捣蛋”的实参,我不知道这是否为 SwiftUI 中的一个 Bug,因为在示例代码中我们并没有任何明显“违规的行为”。


想要继续深入探索的小伙伴们可以在 Xcode 中设置如下符号断点:

[UIBezierPath _continuousRoundedRectBezierPath:withRoundedCorners:cornerRadii:segments:smoothPillShapes:]

然后运行 App,等进入中断后分析通用寄存器组,看一下到底哪个参数的值是“罪魁祸首”:

在这里插入图片描述

这里限于篇幅就不进一步展开讨论了。


其实,我们高度怀疑这个错误不是用户输入而是用户在 TextField 上长按弹出系统选择菜单所引起的。这就意味着它作为一个系统层面上 Bug 的嫌疑又大了不少。

这个问题在未来系统中是否会自行消失呢,让我们拭目以待吧!


关于该“错误”的进一步讨论,请小伙伴们移步 Apple 开发者官方论坛一探究竟:

  • Invalid Numeric Value (NaN) Error in SwiftUI’s TextField on Long-Press

总结

在本篇博文中,我们介绍了 Xcode 15 运行 SwiftUI 代码出现“has passed an invalid numeric value to CoreGraphics”警告这一现象,并根据提示向小伙伴们演示了如何在 Xcode 中为 App 添加运行时的环境变量。

感谢观赏,再会!😎

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/637072.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

scratch图章画图 2024年3月中国电子学会图形化编程 少儿编程 scratch编程等级考试四级真题和答案解析

目录 scratch图章画图 一、题目要求 1、准备工作 2、功能实现 二、案例分析 1、角色分析 2、背景分析 3、前期准备 三、解题思路 1、思路分析 2、详细过程 四、程序编写 五、考点分析 六、推荐资料 1、入门基础 2、蓝桥杯比赛 3、考级资料 4、视频课程 5、p…

mysql基础14——视图

视图 视图是一种虚拟表 可以把一段查询语句作为视图存储在数据库中 需要的时候把视图看作一个表&#xff0c;对里面的数据进行查询 视图并没有真正存储数据 避免了数据存储过程中可能产生的冗余 提高了存储的效率 子查询 嵌套在另一个查询中的查询 派生表 如果在查询中…

【linux】基础IO(软硬链接)

上一节我们已经搞懂了已经被打开的文件&#xff0c;还有没有被打开的文件都是怎样被管理起来的&#xff0c;同样&#xff0c;路径的重要性也不言而喻&#xff0c;是确定文件在那个分区&#xff0c;进而可以解析到目标文件与目录内容的关系&#xff0c;从而找到inode&#xff0c…

机器学习预测汽车油耗效率 MPG

流程 数据获取导入需要的包引入文件,查看内容划分训练集和测试集调用模型查看准确率 数据获取 链接&#xff1a;https://pan.baidu.com/s/1KeIJykbcVpsfEk0xjhiICA?pwd30oe 提取码&#xff1a;30oe --来自百度网盘超级会员V1的分享导入需要的包 import pandas as pd imp…

【QT学习】8.qt事件处理机制,事件过滤器,自定义事件

1.qt事件处理机制 事件处理&#xff1a; 当用户移动鼠标的时候 &#xff0c;创建一个 鼠标移动事件对象 然后把这个对象放到 事件队列里面去&#xff0c;事件管理器 从队列中 取出事件&#xff0c;然后 调用其对应的事件处理函数。 多态机制&#xff1a; &#x…

跨考计算机408,小白一定要知道的这件事!

跨考408一定要学好数学&#xff01; 为什么&#xff1f; 因为这是跨考的同学唯一的优势&#xff0c;408是有门槛的&#xff0c;这个门槛包括但不限于&#xff0c;数据结构&#xff0c;计算机组成原理&#xff0c;操作系统等科目&#xff0c;还有编程能力&#xff0c;推理能力…

IEEE PDF eXpress Validating Pdf..之后Error in converting file

在将自己写好的pdf论文转化为IEEE出版的pdf论文格式的时候&#xff0c;错误如下图&#xff1a; 解决办法如下&#xff1a;失败之后&#xff0c;那里有一个选项按钮&#xff0c;叫做manual request&#xff0c;也就是人工转换&#xff0c;点那个申请就可以了&#xff0c;然后也挺…

如何在宝塔中使用命令行执行命令

一、 进入宝塔&#xff0c;找到网站然后点击根目录 二、进入项目中&#xff0c;然后点击 终端 三、如果这里会弹出输入密码的框&#xff0c;那就是需要你输入一下你服务器的 账号密码&#xff0c;然后就登录进去了&#xff0c;可以在这里直接执行命令即可&#xff0c;比如我这里…

TorchEEG文档_学习笔记1【代码详解】

文章目录 一、用户文档1.安装Pytorch2.安装TorchEEG3.安装与图算法的插件 二、教程1.使用TorchEEG完成深度学习工作流程2datasets模块3.transforms模块4.models模块5.trainer模块6.使用Vanilla PyTorch训练模型 一、用户文档 1.安装Pytorch TorchEEG依赖于PyTorch,根据系统、…

git 小记

一、 github新建仓库 git clone 。。。。。。。。。。。 &#xff08;增删查补&#xff0c;修改&#xff09; git add . git commit -m "修改” git push (git push main) 二、branch 分支 branch并不难理解&#xff0c;你只要想像将代码拷贝到不同目录…

Linux操作系统·Linux简介

1.世界上第一个完善的网络操作系统 Unix是1969年由美国电话电报公司(AT&T)贝尔实验室的两个工程师所创造的操作系统&#xff0c;它允许计算机同时处理多用户和程序。目前大型政府单位、大型企业、航空公司、金融机构多在使用&#xff0c;价钱昂贵&#xff0c;但性能和稳定性…

排序之插入排序:从斗地主到插入排序

目录 1.斗地主如何摸牌 2.从摸牌想到插入排序 3.完成插入排序 4.结束语 1.斗地主如何摸牌 不知道各位是否玩过几乎人人都玩过的斗地主游戏呢&#xff1f;相必各位或多或少都玩过一点&#xff0c;再没玩过也看别人打过。今天博主就将从这个游戏为大家讲解我们的插入排序。 在…