Xcode入门秘籍——很多iOS开发者都不知道的基本操作

16,647 阅读14分钟

背景

对于iOS开发者,Xcode是我们最常用的开发工具。能够熟悉Xcode工具的常用界面元素以及常用快捷键和常用调试方式,对于高效开发非常重要,往往可以让我们事半功倍。然而由于这些知识点非常琐碎,所以在使用时往往会忘,常常需要查来查去,本文特意做了归纳总结,希望帮助每个iOS开发者码code如飞!

一、Xcode界面和常用快捷键介绍

1.1 Xcode 页面介绍

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

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

1.2 资源管理器快捷键介绍

详细功能分别为:

  • 项目导航器(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

1.3 部分页面显示和隐藏

上图从左到右分别为:

  1. 隐藏/显示 左边项目导航页面
  2. 隐藏/显示 下面项目Debug区域
  3. 隐藏/显示 右边工具栏 分别对应快捷键如下:
作用快捷键组合
隐藏/显示 左边项目导航页面Command + 0
隐藏/显示 下面项目Debug区域Command + Shift + Y
隐藏/显示 右边工具栏Command + Option + 0

1.4 常用组合快捷键

1.4.1 系统截屏快捷键

作用快捷键组合
截取当前整个屏幕到文件Command + Shift + 3
截取当前屏幕到剪贴板Command + Shift + Control + 3
截取所选屏幕区域到文件Command + Shift + 4
截取所选屏幕区域到剪贴板Command + Shift + Control + 4

1.4.2 Xcode文件操作快捷键

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

1.4.3 Xcode调试快捷键

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

新版的Mac,如果匹配了触摸栏,在进行单步调试时需要现将先将F1、F2等功能键设置出来。步骤:打开 “系统偏好设置” ,点击 “键盘” 选项,在 “触控栏显示”一栏中选择为“F1、F2等键

如果不进行以上设置,则需要按着键盘左下角的 「fn」键,就可以看到触控栏上显示出 F1 等键了。

1.4.4 Xcode文件内编辑快捷键

作用快捷键组合
左缩进Command + [
右缩进Command + ]
当前文件搜索Command + F
当前文件文本替换Command + Option + F
全局检索快捷键Command + Shift  + F
全局文本替换Command + Shift  + Option +  F
搜索下一处Command + G
搜索上一处Command + Shift + G
快速跳到当前类的指定行Command + L
快速查找打开某个类Command + Shift + O
代码折叠与打开Command + Option + ⬅️ 或 ➡️ 光标需放在方法里
当前文件修改局部变量快捷键Command + Control + E (必须光标在一个变量上面)
格式化代码Control + I
将代码所在文件定位到左边项目导航器中Command + Shift  +  J
程序中 .h 和 .m 文件间快速切换Command + Control +  ⬆️ 或 ⬇️
go Back 或 go ForwardCommand + Control + ⬅️ 或 ➡️
去本行代码的行首 或 行尾Command + ⬅️ 或 ➡️
当前行上移或者下移Command + Option + ] / [

二、Xcode常用调试方法

总体来看,关于Xcode基本的调试方法包括有以下几个部分:断点、日志输出&&LLDB、性能检测、和视图调试器。

2.1 断点

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

2.1.1 普通断点

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

2.1.2 条件断点

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

  • 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选项):选中后,表示断点不会终止程序的运行。

2.1.3 异常断点

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

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

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

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

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

2.1.4 符号断点

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会停在你的断点方法中。

2.2 日志输出

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

2.2.1 help命令

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

2.2.2 expression命令

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

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

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

2.2.3 p & print  & e  & call 命令

2.2.4 po 命令

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

2.2.5 call 命令

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

2.2.6 image 命令

常用命令如下:

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

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

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

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

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

2.3 LLDB调试对话窗

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

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

2.4 性能检测

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

2.5 视图调试器(Debug View Hierachy)

下面介绍一下在查看UI时经常用到的视图调试器:

Debug View Hierachy:调试视图层次,除了点击控制台出的图标,也可以从菜单中选择 Debug -> View Debugging -> Capture View Hierarchy来启动视图调试。在断点或者不是断点的情况下都可以通过点击这个按钮查看视图层级关系。

有了这个图层关系,我们可以很清楚的知道视图页面上的各个控件的位置关系,当我们在开发测试阶段时遇到某个控件不显示、控件被遮挡、或者需要查看当前视图view的类文件名时等,都可以通过视图调试器查看开进行调试查看,提高我们的开发效率。

2.6 调试导航器

调试导航器(Debug navigator)在测试项目时极为有用,在这里我们不仅可以看到APP的【CPU】处理器、【Memory】内存、【Disk】硬盘、【Network】网络请求的实时状态,并且在调试代码时也查看当前函数的调用信息。

2.6.1 查看函数的调用信息

假如在下图中的第47行打了一个普通断点,此时方法执行到第46行停止,我们可以在调试导航器中看到当前函数被哪个线程的哪个函数调用,比如本例中该 viewModel 的懒加载函数其实是在 Thread 1 (main Thread)中的  -[ContainerViewController viewDidLoad] 方法被调用。

2.6.2 CPU使用信息

想要开发出高性能的APP,我们必须对以下面板信息时刻关注并不断改进。

2.6.3 内存占用信息

2.6.4 磁盘占用信息

2.6.5 网络请求信息

总结

本文主要总结介绍了一些关于Xcode使用提效的基本操作,希望能够帮助对这部分知识不够熟悉的 iOS 开发的小伙伴解决实际学习和工作中可能遇到的问题. 如有纰漏, 欢迎各位路过的大佬们批评指正,提出宝贵意见。有问题的朋友也希望各位留言讨论,与大家共同进步,感谢!

hi, 我是快手电商的小博

快手电商无线技术团队正在招贤纳士🎉🎉🎉! 我们是公司的核心业务线, 这里云集了各路高手, 也充满了机会与挑战. 伴随着业务的高速发展, 团队也在快速扩张. 欢迎各位高手加入我们, 一起创造世界级的电商产品~

热招岗位: Android/iOS 高级开发, Android/iOS 专家, Java 架构师, 产品经理(电商背景), 测试开发... 大量 HC 等你来呦~

内部推荐请发简历至 >>>我们的邮箱: hr.ec@kuaishou.com <<<, 备注我的花名成功率更高哦~ 😘