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博客

 

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

前端面试题(CSS篇二)

一、请解释一下 CSS3 的 Flex box(弹性盒布局模型),以及适用场景 相关知识点: Flex是FlexibleBox的缩写,意为"弹性布局",用来为盒状模型提供最大的灵活性。 任何一个容器都可以指定为Flex布局。行内元素也可…

Unity之VS脚本自动添加头部注释Package包开发

内容将会持续更新,有错误的地方欢迎指正,谢谢! Unity之VS脚本自动添加头部注释Package包开发 TechX 坚持将创新的科技带给世界! 拥有更好的学习体验 —— 不断努力,不断进步,不断探索 TechX —— 心探索、心进取&…

Swift 中的方法调用机制

Swift 方法调用详解:与 Objective-C 的对比、V-Table 机制、Witness Table 机制 在 iOS 开发中,Swift 和 Objective-C 是两种常用的编程语言。尽管它们都能用于开发应用程序,但在方法调用的底层机制上存在显著差异。本文将详细介绍 Swift 的…

CD4017 – 带解码输出的十进制计数器

CD4017 IC 是一个十进制计数器,它有 10 个输出,分别代表 0 到 9 的数字。计数器在(14号引脚)每个时钟脉冲上升时增加 1。计数器达到 9 后,它会在下一个时钟脉冲时从 0 重新开始。 引脚名称管脚 #类型描述VD…

【常用工具】Linux命令行Restful接口调试神器——curl脚本

最近的工作经常要涉及到在Linux服务器端和外部系统联调接口,由于Postman无法在命令行使用,这里浅记一个curl脚本模板: #!/bin/bash # 请求标题 TITLE # token信息 TOKEN # url信息 URL # 请求方式 METHODPOST # Restful请求报文 BODYecho -e…

暑假学习DevEco Studio第2天

学习目标: 掌握页面跳转 学习内容: 跳转页面 创建页面: 在“project”窗口。打开“entry>src>main>ets”,右击“pages”,选择“New>ArkTS File”,命名“Second”,点击回车键。 在页面的路由&#xff0…

Go语言--函数类型、匿名函数和闭包

在Go语言中,函数也是一种数据类型,我们可以通过 type 来定义它,它的类型就是所有拥有相同的参数,相同的返回值的一种类型。 语法 通过type给函数类型起名,然后通过名字进行函数的调用 好处:多态 通过统…

【营销策划模型大全】私域运营必备

营销策划模型大全:战略屋品牌屋、电商运营模型、营销战略、新媒体运营模型、品牌模型、私域运营模型…… 该文档是一份策划总监工作模型的汇总,包括战略屋/品牌屋模型、营销战略模型、品牌相关模型、电商运营模型、新媒体运营模型和私域运营模型等&…

​​服务拆分的原则

目录 一、单一职责原则 二、服务自治原则 三、单向依赖 一、单一职责原则 单⼀职责原则原本是面向对象设计中的⼀个基本原则, 它指的是⼀个类应该专注于单⼀功能. 不要存在多于⼀个导致类变更的原因 在微服务架构中, ⼀个微服务也应该只负责⼀个功能或业务领域, 每个服务应该…

C++ | Leetcode C++题解之第216题组合总和III

题目&#xff1a; 题解&#xff1a; class Solution { private:vector<vector<int>> res;void backtracking(int k, int n, vector<int> ans){if(k 0 || n < 0){if(k 0 && n 0){res.emplace_back(ans);}return;}int start (ans.size() 0 ?…

恒创科技:HTTP错误码403禁止意味着什么,怎么修复它?

HTTP错误码403禁止意味着客户端无权访问特定网页或服务器。403 错误表示客户端存在问题&#xff0c;无论用户使用的是哪种网络浏览器&#xff0c;都可能发生这种情况。幸运的是&#xff0c;阻止服务器允许访问特定页面的问题通常可以修复。以下是一些常见原因和相应的解决方案。…

【Android源码】Gerrit安装

前言 如果你打开 https://android.googlesource.com/platform/manifest&#xff0c;就会发现&#xff0c;google官方管理Android源码&#xff0c;使用的是Gerrit。Android系统源码是非常大的&#xff0c;用Git肯定是不适合。对于大型项目&#xff0c;得用Gerrit&#xff0c;今…

背包问题(一)

一.P3985 不开心的金明(01背包变式) 解析: 一开始没有看数据范围,直接当01背包直接写了,结果最后4个测试点RE,一看到数据范围就老实了,1e9的数据,数组直接炸,所以不能直接使用一维的01背包.看了一下题解,部分人是通过极差对数据进行分类,按照300进行分开,使用贪心和dp一起做. …

7_1_SVPWM概述

1、SPWM 正弦脉宽调制法&#xff08;SPWM&#xff09;是将每一正弦周期内的多个脉冲作自然或规则的宽度调制&#xff0c;使其依次调制出相当于正弦函数值的相位角和面积等效于正弦波的脉冲序列&#xff0c;形成等幅不等宽的正弦化电流输出。 通过调整占空比使等效电流近似为正弦…

DT浏览器很好用

DT浏览器是一款简单的浏览器&#xff0c;又是强大的浏览器&#xff0c;界面简洁大方&#xff0c;软件使用流畅。DT浏览器的网址收藏&#xff0c;人工智能写作&#xff0c;书法笔记等功能与众不同。DT浏览器的图文识别功能和笔记本搭配使用&#xff0c;可以对内容编辑修改和保存…

时序模型综述论文

时序模型综述论文&#xff1a; A Survey of Time Series Foundation Models: Generalizing Time Series Representation with Large Language Model

c++ String

1.string类 还记得我们数据结构学的串吗&#xff0c;现在在c中&#xff0c;我们有了c提供的标准库&#xff0c;它是一个写好的类&#xff0c;非常方便使用 1. string是表示字符串的字符串类 2. 该类的接口与常规容器的接口基本相同&#xff0c;再添加了一些专门用来操作strin…

学习笔记——动态路由——OSPF工作原理(SPF算法)

3、SPF算法 SPF算法(最短路径优先算法&#xff0c;也称Dijkstra算法)由荷兰科学家狄克斯特拉于1959年提出的。 SPF算法将每一个路由器作为根(ROOT)来计算其到每一个目的地路由器的距离&#xff0c;每一个路由器根据一个统一的数据库会计算出路由域的拓扑结构图&#xff0c;该…

MySQL:MySQL总结

文章目录 MySQL思维导图基础实际在 Innodb 存储引擎中&#xff0c;会用一个特殊的记录来标识最后一条记录&#xff0c;该特殊的记录的名字叫 supremum pseudo-record &#xff0c;所以扫描第二行的时候&#xff0c;也就扫描到了这个特殊记录的时候&#xff0c;会对该主键索引加…