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

news/2024/5/4 22:00:44

在这里插入图片描述

概览

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.mrgr.cn/p/37227703

相关文章

cdh cm界面HDFS爆红:不良 : 该 DataNode 当前有 1 个卷故障。 临界阈值:任意。(Linux磁盘修复)

一、表现 1.cm界面 报错卷故障 检查该节点&#xff0c;发现存储大小和其他节点不一致&#xff0c;少了一块物理磁盘 2.查看该磁盘 目录无法访问 dmesg检查发现错误 dmesg | grep error二、解决办法 移除挂载 umount /data10 #可以移除挂载盘&#xff0c;或者移除挂载目…

boss直聘__zp_stoken__逆向

声明 本文章中所有内容仅供学习交流,抓包内容、敏感网址、数据接口均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关,若有侵权,请联系我立即删除! 目标网站 aHR0cHM6Ly93d3cuemhpcGluLmNvbS93ZWIvZ2Vlay9qb2I/cXVlcnk9SmF2YSZjaXR5PTEwM…

带头循环双向链表专题

1. 双向链表的结构 带头链表⾥的头节点&#xff0c;实际为“哨兵位”&#xff0c;哨兵位节点不存储任何有效元素&#xff0c;只是站在这⾥“放哨 的” “哨兵位”存在的意义&#xff1a; 遍历循环链表避免死循环。 2. 双向链表的实现 2.1双向链表结构 typedef int DataTyp…

delphi清理txt文件多余的空格

PDF文件转存为文本,多了一堆不需要的空格,写个小程序处理一下,没逻辑,直接上代码。 delphi用的是XE11.3unit UnitSmallMain;interfaceusesSystem.SysUtils, System.Types, System.UITypes, System.Classes, System.Variants,FMX.Types, FMX.Controls, FMX.Forms, FMX.Graph…

[算法学习笔记] 并查集

并查集。非基础教学。提示:本文并非并查集模板讲解,是在模板基础上的进一步理解以及拓展。 Review 并查集可以用来维护集合问题。例如,已知 \(a,b\) 同属一个集合,\(b,c\) 同属一个集合。那么 \(a,b,c\) 都属一个集合。 并查集分为 合并,查询 操作。定义 \(fa_i\) 表示点 …

sherpa + ncnn 离线语音识别

目录结构 前言音视频格式转为wavsherpa-ncnn编译LinuxWindowswindows编译中遇到的问题问题“nmake -? failed with: no such file or directory”编译失败原因 成功编译截图 可执行程序说明模型下载语言识别测试LinuxWindows 参考文献 前言 小编需要实现离线音视频语言部分识…

【问题处理】银河麒麟操作系统实例分享,服务器操作系统VNC远程问题分析

1.服务器环境以及配置 【内核版本】 4.19.90-23.8.v2101.ky10.aarch64 【OS镜像版本】 0518-server 2.问题现象描述 服务器通过vncserver:1.service服务启动的vnc服务后&#xff0c;普通用户用vnc连接时&#xff0c;锁屏后&#xff0c;然后输入登陆密码会报密码错误&…

写博客复制黏贴的模板

Armv8/Armv9架构从入门到精通&#xff0c;Armv8/Armv9架构从入门到精通&#xff08;一期&#xff09;&#xff0c;Armv8/Armv9架构从入门到精通&#xff08;二期&#xff09; Armv8/Armv9架构从入门到精通&#xff08;三期&#xff09;&#xff0c;Arm一期、Arm二期、学习资料、…

计算机网络---第十一天

生成树协议 stp作用&#xff1a; 作用&#xff1a;stp用于解决二层环路问题。 BPDU&#xff1a; 含义&#xff1a;桥协议数据单元&#xff0c;用于传递stp协议相关报文 分类&#xff1a;配置bpdu---用于传递stp的配置信息 tcn bpdu---用于通告拓扑变更信息 包含信息&…

2024.04.24 完成的任务

今天在菜鸟教程学了这些内容。。。具体内容如下: <!DOCTYPE html> <html lang="en"> <head><meta charset="UTF-8"><title>我的联通</title><head></head></head><body><h1>中国联通&…

用AI给“高品质”加速,爱奇艺长期主义的又一程

「 AI时代,爱奇艺心态稳定,路线清晰。 」2023年卷大模型,2024年卷应用。作为新质生产力,生成式AI正在千行百业落地——看上去离AI更近的影视行业,也被市场持续注视。 环境的变化催着行业跑起来,谁起跑更早,谁跑得更稳?身处变局中的人多少都闻到一些焦虑的味道。在这样的…

【Web安全之机器学习】①分析邮箱数据

Enron数据集:https://www2.aueb.gr/users/ion/data/enron-spam/ Enron(安然公司)在2001年宣告破产之前,拥有约21000名雇员,曾是世界上最大的电力、天然气以及电讯公司之一,2000年披露的营业额达1010亿美元之巨。公司连续六年被财富杂志评选为“美国最具创新精神公司”,然…

Windows编程系列:设备I/O

Windows设备 在Windows平台下,设备被定义为能够与之进行通信的任何东西。最常见的 I/O 设备包括:文件、文件流、目录、物理磁盘、卷、控制台缓冲区、磁带驱动器、通信资源、mailslot 和管道等。 平常我们使用的文件,目录都可以称之为设备。本文是介绍设备的通用操作,以文件…

【C 数据结构】二叉树

文章目录 【 1. 基本原理 】1.1 二叉树的性质1.2 满二叉树1.3 完全二叉树 【 2. 二叉树的顺序存储结构 】2.1 完全二叉树的顺序存储2.2 普通二叉树的顺序存储2.3 完全二叉树的还原 【 3. 二叉树的链式存储结构 】【 4. 二叉树的先序遍历 】4.1 递归实现4.2 非递归实现 【 5. 二…

Modbus转Profinet网关接电表与工控机通讯

Modbus转Profinet网关(XD-MDPN100/300)的主要功能是实现Modbus协议和Profinet协议之间的转换和通信。Modbus转Profinet网关集成了Modbus和Profinet两种协议,支持Modbus RTU主站/从站,并可以与RS485接口的设备,如变频器、智能高低压电器、电量测量装置等进行连接。同时,它…

安全中级-初开始

一、网络基础 重要点&#xff1a;TTL值&#xff08;防环&#xff0c;linux64.Windows128 &#xff09;&#xff0c;IP数据包包头格式字节&#xff08;20&#xff09; 标识标志偏移量起到什么作用&#xff08;数据超过1500会分片&#xff09; wireshack抓包会有一个MSS&#x…

面试被刷,原因居然是不会Git

大家好,我是知微! 假设你是一个刚入行的菜狗程序员,正在开发一个软件。现在老板需要你加一些功能,此时的你有一些担忧,如果对代码进行大刀阔斧的改动,最终却失败了。之前能正常运行的代码也被改得乱七八糟的,跑不起来了,那可咋办? 聪明的你想到了一个绝妙的主意,那就…

风格迁移adaIN 和iT的adaLN

文章目录 BN、LN、IN、GN的区别![](https://img-blog.csdnimg.cn/direct/d38c005616f145cba2aa1c4c2e046be0.png)图像风格迁移adaINDiT adaLN BN、LN、IN、GN的区别 BatchNorm&#xff1a;batch方向做归一化&#xff0c;算NxHxW的均值&#xff0c;对小batchsize效果不好&#x…

【pytorch学习】之线性神经网络-线性回归

线性神经网络 【摘要】在介绍深度神经网络之前,我们需要了解神经网络训练的基础知识。我们将介绍神经网络的整个训练过程,包括:定义简单的神经网络架构、数据处理、指定损失函数和如何训练模型。为了更容易学习,我们将从经典算法————线性神经网络开始,介绍神经网络的基…

分布式事务的实现方式

分布式事务的5种实现方式XA方案 TCc方案 本地方法表 可靠性消息最终一致性方案 最大努力通知方案1.两阶段提交/XA方案 所谓的 XA 方案,即:两阶段提交,有一个事务管理器的概念,负责协调多个数据库(资源管理器)的事务,事务管理器先问问各个数据库你准备好了吗?如果每个数…