how to use Xcode

Xcode IDE概览

Xcode 页面主要分为以下四个部分:

  • 工具栏(ToolBar area):主要负责程序运行调试,编辑器功能区域的显示 / 隐藏;
  • 编辑区(Editor area):代码编写区域;
  • 导航区(Navigator area):展示工程文件列表;
  • 调试区(Debug area):用于程序调试,查看对象信息,打印日志等。

 导航区

详细功能分别为:

  • 项目导航器(Project navigator):在工程中添加、删除、分组以及管理文件、查看文件、或者在编辑取区编辑其内容
  • 版本控制管理器 (Source Control navigator): 查看源代码控制工作副本、分支、提交、标签和远程代码库。
  • 符号导航器(Symbol navigator):集成所有在工作区中定义的符号,从根本上说符号就是编辑器所能识别的东西,eg:OC 类、结构体、枚举类型、全局变量等
  • 搜索导航器(Find navigator):在项目和框架中查找任何字符串、引用、定义以及调用层级。
  • 问题导航器(Issue navigator):可查看在打开、分析以及构建项目过程中发现诊断、警告以及错误信息
  • 测试导航器(Test navigator):创建、管理、运行以及检查单元测试
  • 调试导航器(Debug navigator):查看项目运行的 CPU、内存、磁盘、网络等情况,详细介绍
  • 断点导航器(Breakpoint navigator):添加、删除和编辑断点。
  • 报告(日志)导航器(Report navigator):查看构建、运行和调试项目以及源代码控制任务的历史记录。

分别对应快捷键为:Command + 1 ~ 9

Xcode 常用快捷键

文件操作快捷键

作用快捷键组合
在当前工程中创建一个新文件 (一般包括.h 和 .m 文件)Command + N
在当前工程中创建一个新工程Command + Shift + N
在工程中关闭当前正在屏幕中显示的文件Command + W
最小化 xcode 编译器窗口Command + M

调试快捷键 

作用快捷键组合
编译并运行Command + R
编译Command + B
强制退出Command + Q
停止运行Command + .
继续 (到下一个断点,如果没有则执行到结束)Command  + Control +  Y
单步调试F6
跳入某函数F7
跳出某函数F8
添加 / 删除断点Command + \  (光标必须在指定的行)
静态代码分析Command + Shift + B

 Xcode 常用调试方法

断点

断点里面根据作用和功能也有很多种类:普通断点、条件断点、异常断点、符号断点等。

 普通断点

当程序运行到断点处时会暂停运行。比如断点打在 30 行,那么程序就会停在 30 行(注意:程序只运行到了前 29 行,第 30 行其实还没有被执行。)。只要在代码行旁边点击,就能添加一个断点,再次点击,断点变成浅蓝色,就能让断点不可用(disable 了,仍然存在,只是不起作用了)。 

条件断点

打上断点之后,对断点进行编辑,设置相应过滤条件。单击右键会弹出选项框,四个选项分别为:

  • Edit BreakPoint:编辑断点。
  • Disable  BreakPoint:断点失效。(相当于上边说到的单击断点变成浅蓝色,断点失效)
  • Delete BreakPoint:删除断点。
  • Reveal in BreakPoint Navigator:在左边的断点树状结构表明该断点。

这里我主要用到的是第一个:Edit BreakPoint。这里面设置断点的筛选条件(双击断点也可以快速进入编辑断点的对话框)。

  1. Condition: 返回一个布尔值,当布尔值为真触发断点,一般里面我们可以写一个表达式。
  2. Ignore: 忽略前 N 次断点,到 N+1 次再触发断点。
  3. Action: 断点触发事件,分为以下六种: 
    • AppleScript:执行脚本。
    • Capture GPU Frame:用于 OpenGL ES 调试,捕获断点处 GPU 当前绘制帧。
    • Debugger Command:和控制台中输入 LLDB 调试命令一致。
    • Log Message:输出自定义格式信息至控制台。
    • Shell Command:接收命令文件及相应参数列表,Shell Command 是异步执行的,只有勾选 “Wait until done” 才会等待 Shell 命令执行完在执行调试。
    • Sound:断点触发时播放声音。
  4. Options (Automatically continue after evaluating actions 选项):选中后,表示断点不会终止程序的运行。

异常断点

利用 Xcode 进行软件开发时,总避免不了出现异常而导致程序崩溃,但有时候又不知道哪里出错,只能利用下断点一点一点测试,虽然也能测出来但总是不能一步到位。其实 Xcode 有个异常断点,可以在导致程序崩溃或者引发异常的那行代码上自动设置断点。

步骤 1⃣️:(1)打开断点导航器 -> (2) 点击下方➕号 ->(3)选择 “Exception Breakpoint”

步骤 2⃣️:按照上述步骤选择之后,将会看到异常断点的编辑条件,在这里你可以根据自己的需要编辑自己的异常断点条件:

Exception 选项可以让你选择响应 Objective-C 对象抛出的异常,也可以选择响应 C++ 对象抛出的异常。 Break 则是选择断点所接收的异常,是接收 “Throw” 语句抛出的异常还是 Catch 语句的。

步骤 3⃣️:运行程序,解决问题后。删除该异常断点。

符号断点

Symbolic Breakpoint 为符号断点,可以针对某一个方法 (函数) 设置断点并暂停执行;有时候,我们并不清楚会在什么情况下调用某一个函数,那我们可以通过符号断点来跟踪获取调用该函数的程序堆栈。

步骤 1⃣️:如同设置异常断点一样,在点击➕之后,选择 “Symbolic BreakPoint

步骤 2⃣️:编辑要断点的方法名、条件等。

  • Symbol:填入你想设置断点的方法(例如:-[NSException raise],- 号是实例方法,+ 号是类方法)。
  • Module:填入要设置断点的方法或函数是否在位于 dylib 中,默认不填。
  • Conditon:填入条件,例如:(BOOL)[item isEqualToString:@“test”] 前面的(BOOL)是必须的。否则 console 会提示类型不符合,导致条件不能生效。意思是 item(NSString)是 test 时停下。
  • Ignore:忽略几次。
  • Action:可在程序断点执行后增加额外动作(Applescript,捕捉动画帧速,调试器命令(lldb),输入 log 记录,终端命令(shell), 播放声音)例如:Debugger Commond 中可填入 
    • po item 输出 item 变量的值
    • bt 表示输出 方法调用堆栈信息

步骤 3⃣️:假如输入的方法名为: [UIView init],此时就可以看到新加的断点方法。

步骤 4⃣️:运行项目,此时 Xcode 会停在你的断点方法中。

日志输出

关于日志输出,最先可能想到的是在代码编辑区的 NSLog (),虽然在打印的时候很清晰,但是缺点就是在我们需要在想要打印的位置添加 NSLog 代码并重新运行项目,这样会比较耽误时间,影响开发效率,而我们在调试过程中用的比较多的是打断点,然后 p 或者 po 一下。这个 p 和 po 就是 LLDB 中的打印(print)命令。像下图中,在 29 行中打了断点,在下方控制台的右边会出现一个 "lldb" 的对话窗。

help 命令

在 lldb 中输入 help,然后回车,可以看到 lldb 的一些常用的命令,如下图所例。常用的命令为 po、p、expression、call...

expression 命令

expr 或 e : expression 的缩写,可以在调试时动态执行指定表达式,并将结果打印出来,是 LLDB 调试命令中最重要的命令,我们以后经常用到的 p 和 po 命令的鼻祖 。expression 命令主要有两个功能:

  • 执行表达式
  • 输出返回值

注意:虽然 expression 命令有输出返回值功能,但是在日常调试过程中并不常用,一般这类打印功能被 p 和 po 命令代替,而 expr 常用于在调试过程中修改变量的值。

 p & print  & e  & call 命令

 po 命令

oc 里所有的对象都是用指针表示的,打印出来的是对象的指针,而不是对象本身,可以采用 -o 来打印对象本身为了更加方便的时候,LLDB 为 “expression -o --”  定了一个别名 :po ,它可用于输出 OC 对象和对象的信息。

 call 命令

方法调用:在断点调用某个方法,并输出此方法的返回值,一般常用于方法的调用

image 命令

常用命令如下:

  • image list:查看工程中使用的库
  • image lookup:可以用来查找可执行文件或共享库的原始地址,当程序崩溃的时候,可以使用这条命令来查找崩溃所在的具体位置。

如下代码:

运行此代码,崩溃信息如下:

上述 crash 根据调用栈信息如何定位到具体哪行代码出现问题:

我们可以使用在 LLDB 中使用 image lookup -a 地址  或者   image lookup --address 地址 命令进行定位。

通过逐步查看调用栈信息,我们可以看到的是在 -[ContainerViewController viewDidLoad] 方法中也就是在 ContainerViewController.m 文件的第 36 行数组越界导致的崩溃。

 LLDB 调试对话窗

从左到右功能依次详细介绍:

  1. 显示 / 隐藏控制台
  2. 断点信息:如果为蓝色,就是断点有效。如果点击它变成灰色,就是所有断点不起作用。
  3. continue:点击这个按钮程序就会从当前断点恢复运行,直到下一个断点
  4. step over :点击这个按钮会一步一步的运行,方便调试
  5. step in:点击这个按钮会进入函数内部
  6. step out:点击这个按钮会跳出函数内部,回到函数调用处,一般与左边的按钮对应使用
  7. 视图调试器:查看图层,在第 2.4 四节中详细介绍
  8. 内存结构图(menory graph):方便查看堆栈信息
  9. 覆盖调试器的环境变量设置
  10. 模拟器定位开关

性能检测

静态分析:通过对代码静态分析,找出代码潜在的错误,如内存泄漏、空引用、未使用函数等。方法:菜单 “Product"->"Analyze" 或者使用快捷键  Shift + Command + B ,然后想办法消灭蓝箭头。

具体参考我的这篇博客:

heap memory with Xcode-CSDN博客

 

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

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

相关文章

vue table表格 ( parseTime-格式化时间)

<el-table-column label"发布时间" width"420px" prop"bidPublishDatetime"><template slot-scope"scope"><span>{{ parseTime(scope.row.bidPublishDatetime, {y}-{m}-{d}) }}</span></template></…

Richtek立锜科技车规级器件选型

芯片按照应用场景&#xff0c;通常可以分为消费级、工业级、车规级和军工级四个等级&#xff0c;其要求依次为军工>车规>工业>消费。 所谓“车规级元器件”--即通过AEC-Q认证 汽车不同于消费级产品&#xff0c;会运行在户外、高温、高寒、潮湿等苛刻的环境&#xff0c…

澳蓝荣耀时刻,6款产品入选2024年第一批《福州市名优产品目录》

近日&#xff0c;福州市工业和信息化局公布2024年第一批《福州市名优产品目录》&#xff0c;澳蓝自主研发生产的直接蒸发冷却空调、直接蒸发冷却组合式空调机组、间接蒸发冷水机组、高效间接蒸发冷却空调机、热泵式热回收型溶液调湿新风机组、防火湿帘6款产品成功入选。 以上新…

飞利浦的台灯值得入手吗?书客、松下多维度横评大分享!

随着生活品质的持续提升&#xff0c;人们对于健康的追求日益趋向精致与高端化。在这一潮流的推动下&#xff0c;护眼台灯以其卓越的护眼功效与便捷的操作体验&#xff0c;迅速在家电领域崭露头角&#xff0c;更成为了众多家庭书房中不可或缺的视力守护者。这些台灯以其精心设计…

(vue)eslint-plugin-vue版本问题 安装axios时npm ERR! code ERESOLVE

(vue)eslint-plugin-vue版本问题 安装axios时npm ERR! code ERESOLVE 解决方法&#xff1a;在命令后面加上 -legacy-peer-deps结果&#xff1a; 解决参考&#xff1a;https://blog.csdn.net/qq_43799531/article/details/131403987

【C语言】指针剖析(完结)

©作者:末央&#xff06; ©系列:C语言初阶(适合小白入门) ©说明:以凡人之笔墨&#xff0c;书写未来之大梦 目录 回调函数概念回调函数的使用 - qsort函数 sizeof/strlen深度理解概念手脑并用1.sizeof-数组/指针专题2.strlen-数组/指针专题 指针面试题专题 回调函…

谷粒商城-个人笔记(集群部署篇二)

前言 ​学习视频&#xff1a;​Java项目《谷粒商城》架构师级Java项目实战&#xff0c;对标阿里P6-P7&#xff0c;全网最强​学习文档&#xff1a; 谷粒商城-个人笔记(基础篇一)谷粒商城-个人笔记(基础篇二)谷粒商城-个人笔记(基础篇三)谷粒商城-个人笔记(高级篇一)谷粒商城-个…

【数据结构】02.顺序表

一、顺序表的概念与结构 1.1线性表 线性表&#xff08;linear list&#xff09;是n个具有相同特性的数据元素的有限序列。线性表是⼀种在实际中广泛使用的数据结构&#xff0c;常见的线性表&#xff1a;顺序表、链表、栈、队列、字符串… 线性表在逻辑上是线性结构&#xff0…

GEE计算遥感生态指数RSEI

目录 RESI湿度绿度热度干度源代码归一化函数代码解释整体的代码功能解释:导出RSEI计算结果参考文献RESI RSEI = f (Greenness,Wetness,Heat,Dryness)其遥感定义为: RSEI = f (VI,Wet,LST,SI)式中:Greenness 为绿度;Wetness 为湿度;Thermal为热度;Dryness 为干度;VI 为植被指数…

【多媒体】Java实现MP4和MP3音视频播放器【JavaFX】【音视频播放】

在Java中播放音视频可以使用多种方案&#xff0c;最常见的是通过Swing组件JFrame和JLabel来嵌入JMF(Java Media Framework)或Xuggler。不过&#xff0c;JMF已经不再被推荐使用&#xff0c;而Xuggler是基于DirectX的&#xff0c;不适用于跨平台。而且上述方案都需要使用第三方库…

拒绝信息差!一篇文章说清Stable Diffusion 3到底值不值得冲

前言 就在几天前&#xff0c;Stability AI正式开源了Stable Diffusion 3 Medium&#xff08;以下简称SD3M&#xff09;模型和适配CLIP文件。这家身处风雨飘摇中的公司&#xff0c;在最近的一年里一直处于破产边缘&#xff0c;就连创始人兼CEO也顶不住压力提桶跑路。 即便这样&…

[leetcode]minimum-absolute-difference-in-bst 二叉搜索树的最小绝对差

. - 力扣&#xff08;LeetCode&#xff09; /*** Definition for a binary tree node.* struct TreeNode {* int val;* TreeNode *left;* TreeNode *right;* TreeNode() : val(0), left(nullptr), right(nullptr) {}* TreeNode(int x) : val(x), left(null…

LeetCode 196, 73, 105

目录 196. 删除重复的电子邮箱题目链接表要求知识点思路代码 73. 矩阵置零题目链接标签简单版思路代码 优化版思路代码 105. 从前序与中序遍历序列构造二叉树题目链接标签思路代码 196. 删除重复的电子邮箱 题目链接 196. 删除重复的电子邮箱 表 表Person的字段为id和email…

昇思MindSpore学习总结七——模型训练

1、模型训练 模型训练一般分为四个步骤&#xff1a; 构建数据集。定义神经网络模型。定义超参、损失函数及优化器。输入数据集进行训练与评估。 现在我们有了数据集和模型后&#xff0c;可以进行模型的训练与评估。 2、构建数据集 首先从数据集 Dataset加载代码&#xff0…

在windows上安装objection

安装命令pip install objection -i https://mirrors.aliyun.com/pypi/simple hook指定进程 objection -g 测试 explore 进程名不定是包名&#xff0c;也可能是app名字&#xff0c;如“测试”就是app的名字 若出现如下错误&#xff0c;说明python 缺少setuptools 直接安装setu…

秋招突击——设计模式补充——单例模式、依赖倒转原则、工厂方法模式

文章目录 引言正文依赖倒转原则工厂方法模式工厂模式的实现简单工厂和工厂方法的对比 抽线工厂模式最基本的数据访问程序使用工厂模式实现数据库的访问使用抽象工厂模式的数据访问程序抽象工厂模式的优点和缺点使用反射抽象工厂的数据访问程序使用反射配置文件实现数据访问程序…

检索增强生成RAG系列6--RAG提升之查询结构化(Query Construction)

系列5中讲到会讲解3个方面RAG的提升&#xff0c;它们可能与RAG的准确率有关系&#xff0c;但是更多的它们是有其它用途。本期来讲解第二部分&#xff1a;查询结构化&#xff08;Query Construction&#xff09;。在系列3文档处理中&#xff0c;我们着重讲解了文档解析&#xff…

能保存到相册的风景视频在哪下载?下载风景视频网站分享

在当今以视觉为核心的时代&#xff0c;高清美丽的风景视频不仅能够丰富我们的日常生活&#xff0c;还能提供心灵上的慰藉。无论是为了制作视频项目&#xff0c;还是仅仅想要珍藏一些精美的风景画面&#xff0c;获取高质量的风景视频素材显得尤为重要。许多人可能会问&#xff1…

PTrade量化软件常见问题整理系列2

一、研究界面使用get_fundamentals函数报错&#xff1a;error_info:获取token失败&#xff1f; 研究界面使用get_fundamentals函数报错&#xff1a;error_info:获取token失败&#xff1f; 1、测试版本202202.01.052&#xff0c;升级202202.01.051版本后&#xff0c;为了解决不…

在虚拟仿真中学习人工智能,可以达到什么目标?

人工智能已经成为引领社会创新的关键力量&#xff0c;想要在这个充满机遇的领域中脱颖而出&#xff0c;掌握扎实的专业技能和积累丰富的实践经验至关重要。然而&#xff0c;许多学习者在追求这一目标的过程中面临着几个主要问题&#xff1a;专业技术掌握有难度、实践经验积累存…