Objective-C基础教程读书笔记(7)
第7章 深入了解Xcode
Xcode是一个很好用的工具,有很多强大的功能,不过并不是所有的功能都易于发现。如果你打算长期使用这个强大的工具,就肯定要尽可能多了解它。本章将介绍一些Xcode编辑器的使用技巧,这对于编写和浏览代码以及查找信息都是大有帮助的。此外,还会提到一些用Xcode调试程序的方法。
这里介绍的是Xcode4.3.2,也就是写这本书时的最新版本。苹果公司热衷于在Xcode版本升级时添加或删除一些东西。(默然说话:目前我用的是4.6.2,不知道有多少是一样的)
窗口布局一览
工具栏:位程序窗口的最顶端,上面有很多工具按钮。
导航器面板:位于窗口左边,通常用来显示项目中的文件列表,也可以浏览其他内容,比如符号(symbol)、搜索(Search)、问题(Issue)、调试(Debug)、断点(Breakpoints)和日志(Logs)。可以按住Command键和一个数字键(从1到7)或点击面板顶端的图标来切换视图。
编辑器面板:位于中间偏右的位置。你大部分时间都要在这里大展身手,写下一行行源代码,改变世界,飞黄腾达。
检查器面板:位于窗口右边,显示的是与上下文(当前选中的内容)有关的信息,以及修改选中项属性值的按钮。
调试器面板:位于底部居中位置。调试器运行的时候,堆栈和调试器控制器会出现在这里。
库面板:隐藏在窗口右下角,列有项目资源、对象、代码片段和其他的项目中可能会用到的东西。
改变公司名称
Xcode在注释块中写入了文件名称、项目名称以及创建者和创建时间,包含这些信息是为了让你一眼看去便知道所查看的是哪个文件,谁创建了它,以及它的生成时间。
更改公司名称的方法很简单。在导航器面板选中项目,并确保在编译器面板的Project栏目下选中项目名称。仔细观察右边的检查器面板,在Project Document栏目下你将会看到Organization文本框。在里面输入你的公司名称。
使用编辑器的技巧
Xcode提供了几种组织项目和源代码编辑器的基本方式。我们已经介绍了默认界面,它主要是用来管理实时项目和执行编码任务的一体化窗口,编辑器面板则是用来显示源文件的,内容由窗口左边导航器面板选中的源文件而定。
这里再稍微详细讲解一下你在导航器面板中所看到的内容。文件列表展示了项目中所有有用的部分:源文件、链接的框架和构建程序的Products文件夹。你还可以找到其他实用工具,比如访问源代码版本控制,所有的项目符号,还有智能文件夹。
选中了某个文件后,你会在窗口顶端的工具栏下面看到文件的路径,告诉你文件在项目中的位置。你可以使用导航器面板底部的搜索框来过滤列表文件。
浏览器列出了每个名称中带字符car的源文件。你可以在浏览器中选中它们使编辑器显示它们的内容。因为大型项目可能拥有一百多个源文件,所以如果文件特别多的话,浏览器是一种很方便的管理工具。本章后面会深入介绍源文件导航的相关话题。
编写代码时,可以隐藏浏览器,这样屏幕的可用面积会更大一些。在窗口的右上方有一组标记为View的工具栏按钮。其中有三个按钮,你可以把鼠标悬停在上面来查看其作用,不过,还是在这里跟你直说吧:左边的按钮用来隐藏或显示 导航器面板,你也可以使用Command+0快捷键来调用它;中间的开关按钮负责调试器区域是否可见;右边的按钮负责检查器面板是否可见。
用独立的窗口来显示各自的源文件也是有用的,尤其是当你想比较两个不同文件的时候。在导航器面板中双击源文件就可以在新窗口中打开它。你也可以在两个不同的窗口中显示 同一个文件,不过要注意有时这两个窗口会出现内容不同步的情况,因此你需要点击其中某个窗口来使它们同步。
你可能更倾向于使用标签(就像在Safari中那样)而不是多窗口的显示方式。Xcode已经料到了。就好像Xcode用户都了解Safari用户似的。如果想要显示标签,请选择View->Show Tab Bar选项。如果想要添加标签,就点击标签栏右边的加号按钮。
在Xcode的帮助下编写代码
许多程序员都夜以继日地写代码。Xcode给所有程序员提供了一些功能,使编写代码变得更容易,也更有趣。
首行缩进
有时,对代码进行大量的编辑会使其变得混乱不堪,Xcode可以改善这种状况。选中文本后,按住Control键点击就能看到编辑器的上下文菜单,之后选择Structure-->Re-Indent选项,Xcode将会重新整理好一切。你可以使用快捷键Control+I来达到同样的效果。
按下Command+[或Command+]键可以将选定的代码进行左移或右移。如果你想按照自己的风格来调整Xcode内的代码,主要技巧见Xcode》Preferences》Text Editing》Indentation。
代码自动完成
Xcode会在你输入代码的过程中给出建议,这就是Xcode的代码提示功能,通常叫做代码自动完成。编写程序时,Xcode会为所有内容生成索引,包括项目中的变量名和方法名及导入的框架。它知道局部变量的名称及其类型,甚至可能知道你的编码风格是好还是坏。通过按下tab键来接受Xcode给我们的提示。如果你想关闭提示列表,按esc键就可以了,再按esc又会重新打开自动完成列表。
把鼠标悬停在方法名称上,便会看到窗口右边有一个问号图标,点击它就会打开一个描述方法信息的迷你帮助窗口。
括号配对
输入程序代码时,也许你会发现输入某些字符(比如“)”、“]”、“}”)后屏幕会闪烁。如果发生了这种情况,就是Xcode在告诉你这个闭括号所对应的开括号在哪里,我们在第二行末尾输入了一个右括号,完成后前方相应的左括号就会以背景色短暂闪烁一下。
这个功能有时被称为“括号配对”,它能在你结束一系列复杂的分隔符(也就是括号)集时提供帮助。要保证你输入的每个闭括号都和你想关闭的开括号相互匹配。如果你弄错了,Xcode会发出警报,而且也无法显示与之匹配的开括号。
也可以双击某个分隔符,Xcode会选定它以及与它匹配的括号之间的全部代码。
批量编辑
有时,你可能想要将代码中的革相似更改应用到其他几个地方,但是又不想自己逐个编辑。手动去做大量相似的编辑操作是件危险的事情,因为人类不擅长重复枯燥的工作。所幸,计算机很胜任这类工作。
在这方面对我们有所帮助的第一个Xcode功能并不是去操作代码,而是要建立一个安全网。选择File》Create Snapshot...或按Command+Control+S,Xcode会记住项目当前的状态,现在你就可以放心地编辑源文件了,甚至可以随心所欲地用各种方式“玩坏”你的项目。如果你意识到自己犯了一个很严重的错误,可以通过File》Restore Snapshot...选项打开快照窗口,这样就可以用前一个快照恢复项目了。在你做任何冒险的事情之前最好先创建一个快照。
之后自然就是查找/替换了(默然说话:什么?你从来没用过查找/替换?!好吧。。。我为你冤死的脑细胞及浪费的青春致以最诚恳的默哀)。Edit》Find子菜单包含几个非常方便的选项。选择Find in Workspace(Command+Shift+F),或者在导航器中选择搜索选项,就可以对整个项目中的所有文件进行内容搜索或替换了。
这个查找和替换的功能并不好用。如果你只是想重命名函数的中的变量,它有可能会做多余的操作(比如把别处的同名变量一起给改了)。它还没有办法更改源文件的名称。
Xcode有两个功能可以弥补这些不足。第一个功能我们称为Edit all in Scope。你可以选定一个符号,如局部变量或参数,然后点击它,就会看到右边出现了一个向下的箭头(默然说话:我发现这个向下的箭头有点难出来,似乎是先把光标点到局部变量或参数上,然后对应的变量或参数都会出现一个虚线框,在虚线框上轻移一下鼠标,向下箭头就出现了)。点击箭头就会看到一个菜单,选择Edit all in Scope选项。之后你输入内容就会使所有该符号出现的地方同时更新。输入完毕之后,只要在源文件编辑窗口中单击其他地方,就会退出Edit all in Scope模式。
Xcode中有一些内置的重构工具,其中就有一个能够让你轻松地重新命名类。它不仅能够重命名类,还能做一些诸如重命名相应源文件之类的漂亮活儿。而且如果你开发 的是GUI程序,它还能够深入到nib文件进行修改操作(默然说话:看不懂?据说后续章节会继续介绍,请耐心等待)。
让我们试着将所有的Car类名称替换成Automobile类吧。请在编辑器中打开Car.h文件,并把光标放在类名Car中。选择Edit》Refactor》Rename...选项,会显示一个小小的对话框,在里面填写类名,并点Preview按钮之后,Xcode就会把要做的任务显示出来。它会列出所有可能会被改动的文件及它们改动的地方。
确认这些更改没问题之后,请点击Save按钮。如果你是第一次重构,那Xcode会询问你是否要启用自动快照备份。选择enable是一个明智的决定,这样每一次重构之前,Xcode都会为你做一个快照,虽然会增加内存,但如果你对修改不满意,要撤销就会是很容易的一件事情了。
较为可惜的一件事情是重构并不能重命名注释中的文字。所以,类里面的注释、Xcode生成的文件头注释或者任何你编写的文档注释都需要手工编辑。你可以使用查找和替换功能来简化这一过程。
代码导航
大多数源文件的生命周期都大同小异,创建后很快就被写入大量代码来实现各种功能,接下来进入增增改改的阶段,然后进入维护阶段。你必须先阅读大量文件才能添加或者修改代码。最后,当类编写成熟后,你要在应用之前浏览其代码来了解它是如何工作的。本节主要介绍在代码的生命周期中浏览代码的不同方法。
1.emacs
emacs是一个很早就有的文本编辑器,它诞生于20世纪70年代,可以在现代的Mac操作系统上运行。这里简要介绍一些它的快捷键组合及其含义。
这是一些不用把手从键盘上拿开就能在文字中移动光标的快捷键。这些快捷键可以在Mac下面的各种软件中使用。
control-F:光标前移一格
control-B:光标后移一格
control-P:光标上移一行
control-N:光标下移一行
control-A:光标移动到段落的头部
control-E:光标移动到段落的尾部
control-T:交换光标两边的字符
control-D:删除光标右边的字符
control-K:将当前行光标以后的所有字符全部删除,便于你重写行尾的代码
control-L:将光标置于窗口正中央。如果你找不到光标位置或者想要移动窗口使光标快速定位于正中央,这个快捷键会非常好用。
2.快速打开的窍门
假如你在浏览某个源文件时,看到了文件上方的#import语句,只要选定文件名(甚至可以不用选择.h),然后选择File》Open Quickly选项,Xcode就会为你打开这个头文件。
如果你没有选择任何文本,那么选择Open Quickly选项将会打开一个对话框,这是另一种文件查找方法,你也可以使用快捷键Command+Shift+D来执行Open Quickly命令。这个对话框是个非常简单的窗口,只有一个搜索域和一个表格,但却是非常快捷的项目内容搜索方式。
如果你的显示器很大,就可以在主编辑器旁边使用辅助窗口(View》Assistant Editor》Show Assistant Editor)。默认情况下,如果一个面板显示的是头文件,那么另一个面板显示的就一定是实现文件,不过你也可以根据自己的喜好更改这个设定。点击工具栏的Counterparts菜单可以看到其他选项。
集中精力
你可能已经注意到紧挨着源代码左侧的两个空栏。左边较宽的那栏叫做边栏,我们会在之后讨论调试的时候谈到它。较窄的一栏叫做聚焦栏,顾名思议,聚焦栏能够让你将注意力集中在代码中某个部分。
注意聚焦栏的灰度,代码嵌套得越深,它旁边的聚焦栏中的灰色也会越深。这种颜色编码能够使代码的复杂程序一目了然。你可以在聚焦栏的不同灰色区域悬停鼠标来高亮显示相应的代码片段。
你也可以点击聚焦栏来折叠相应的代码片段。
使用导航条
在代码编辑器的顶部有一个小控件条,也就是导航条。这里面的很多控件可以让你在项目中的源文件之间快速切换。
导航条最左边是一个菜单按钮,可以快速打开编辑器最近访问的历史文件或执行其他高级的操作。接着是后退和前进按钮,可以打开曾经编辑过的文件,工作方式与Safari浏览器的后退和前进按钮一样。这两个按钮后面是显示当前文件在项目中位置的路径(不仅是目录的路径)。路径中的每一项都是一个按钮,可以点击其中任意一个并在弹出的菜单中进行文件导航。
最后一项是函数菜单,它显示的是当前类中的所有函数和方法。如果按住Command按钮并点击函数菜单可以将这些方法按字母顺序排列。
除了方法名之外,你还可以向菜单中加入其他内容。有两种方法:一种是用#pragma mark whatever,whatever处可以填写任何文字,它会出现在函数菜单中。例如#pragma mark -则会在菜单中插入分割线。另一种是使用 “//MARK:” 、 “//TODO:” 、 “//FIXME:” 、 “//!!!:” 、 “//???:”之类符号开头的文本注释,并且将这些文本放入函数菜单中。这些都是程序所做的记号;在程序发布之前最好先看看这些标记。(默然说话:实测,在4.6.2中//!!!:不会显示在函数菜单中,不知道是我没写对,还是书上没说对,还是因为版本升级后把这个注释给取消了。)
“pragma”源自希腊语,意思是“行动”。#pragma指令将Objective-C常规代码之外的信息或说明传递给编译器和代码编辑器。通常,pragma是被忽略的,但它在一些软件开发工具中可能有其他的含义。比如,可以利用它来给未完成的工作做个标记,以便第二天继续未完成的工作,或者把程序中应该注意但却容易忘记的事项写下来。如果某个工具并不知道pragma是什么,并不会生成警告或错误信息,而是很聪明地忽略它。
获取信息
在代码和Cocoa头文件之间自由切换浏览是很好的功能,也很方便,但有时你也需要从代码之外获得信息。幸好,Xcode有一个存储文档和参考材料的“宝库”。
1.获得帮助
检查器的顶端有两个图标。目前第一个图标是被选中的,检查器显示的是当前文件的各种属性。另一个图标可以在检查器中启用快速帮助功能。如果想要使用快速帮助,在代码中点击做任意位置并观察检查器中出现的内容。如果再点击源代码中的其他位置,快速帮助面板便会更新。
2.文档管理程序
如果你想直接访问苹果公司的官方API文档 ,最快的方法是按住option键并双击某个符号,这是查找该符号相关文档的快捷方式。
调试
bug无处不在,程序中有错误是难免的,特别是在当你刚开始使用新的平台和新的语言时。发现问题后,深吸一口气,喝一口你最爱的饮料,然后系统地查找到错误的原因。这个过程我们称之为调试(debugging)。
暴力测试
在程序中写入输出语句来输出程序的控制流程和一些数据值。你也许一直在这么做,只是不知道这种调试方法叫暴力测试。(默然说话:的确,弄程序这么多年,第一次听说这种最常用且有效的方式叫暴力测试。。。。难怪城管们这么喜欢 。。。。)
Xcode的调试器
调试器(debugger)是位于你编写的程序和操作系统之间的程序,它能够中断程序,这样你就可以检查程序的数据,甚至修改程序。完成这些后,就可以恢复程序并查看运行结果。你也可以单步执行代码,减缓程序运行的速度,细致地查看代码会对数据进行哪些改动。
Xcode还有一个提供大量概述信息的调试窗口,以及一个可以直接向调试器发送调试命令的调试控制台。
精巧的调试符号
打算调试程序时,需要确保你正在使用debug构建配置。你可以在Xcode工具栏中Edit Scheme的下拉菜单中找到它。构建配置通知编译器发出额外的调试符号,调试器通过这些符号可以知道它们在程序中的位置。
开始调试
调试的第一件事自然是设置断点,方式与绝大多数的IDE一样,在标有行号的地方单击,就会看到一个蓝色箭头,那就是新断点。删除断点比较奇特,用鼠标把蓝色箭头拖出行号栏,还带有一个爆炸的小动画。如果你再次单击蓝色箭头,蓝色会变浅,表示它暂时被禁用。
设置完断点之后点击运行,程序如果经过了断点,就会停在断点处。这时,你会在调试器面板上方看到多出一个控制条。
从左边开始,第一个按钮用来打开或关闭调试器窗格。后面的四个按钮控制着程序接下来的行为。第一个按钮像播放器的播放按钮,点击它之后程序会继续运行,直到下一个断点,结束或崩溃。
下一个按钮是单步跳过按钮,它看起来象一个箭头跃过了一个小障碍。点击它会执行一行代码,然后又停下来,等着你的命令。再下一个按钮就是单步进入按钮,它看起来象一个向下的箭头指着一个小黑点。点击它,它会让代码进入到一个方法或函数(如果程序里有当前光标所在函数或方法的源代码的时候,如果你没有源代码,它的作用和单步跳过是一致的)。
最后一个按钮单击跳出按钮,单击它会直接执行完当前运行的函数,程序会停在被调用函数的下一行。
再后面的控件是一个可以让你选择观察哪条线程的下拉菜单。
在所有按钮的右边是调用栈,它显示的是当前处于活动状态的函数的集合。
检查程序
现在程序停止执行了,接下来该做些什么呢?通常,当你在程序的某个部分设置断点或者单步执行时,就说明你想了解程序状态——变量的值。
Xcode有数据提示功能,你可以在变量或方法参数上悬停鼠标,Xcode会弹出一个小窗口来显示它的数值。
备忘表
本章提到很多快捷键,画个表总结:
按键 描述
Command+[ 左移代码块
Command+] 右移代码块
Tab键 接受代码自动完成提示
Esc键 显示代码提示菜单
Control+.(半角句号) 循环浏览代码提示
Shift+Control+.(半角句号) 反向循环浏览代码提示
Command+Control+S 创建快照
Control+F 前移光标
Control+B 后移光标
Control+P 移动光标到上一行
Control+N 移动光标到下一行
Control+A 移动光标到本行行首
Control+E 移动光标到本行行尾
Control+T 交换光标左右两边的字符
Control+D 删除光标右边的字符
Control+K 删除本行
Control+L 将光标置于窗口正中央
Command+Shift+O 显示Open Quickly窗口
Command+Control+上方向键 打开相配套的文件
按住Option键双击鼠标 搜索文档
Command+Y 激活/禁用断点
Command+Control+Y 继续运行(在调试器中有效)
F6 跳过
F7 跳入
F8 跳出
小结
这章介绍了Xcode的一些基本特征和使用方法,特别是快捷键,这些东西可以提高我们的工作效率。
下章将详细介绍Cocoa中的一些类。有趣的“类”容终于来啦!
Objective-C基础教程读书笔记(7)的更多相关文章
- SQL Server2012 T-SQL基础教程--读书笔记(1-4章)
SQL Server2012 T-SQL基础教程--读书笔记(1-4章) SqlServer T-SQL 示例数据库:点我 Chapter 01 T-SQL 查询和编程背景 1.3 创建表和定义数据的 ...
- SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章)
SQL Server2012 T-SQL基础教程--读书笔记(8 - 10章) 示例数据库:点我 CHAPTER 08 数据修改 8.1 插入数据 8.1.1 INSERT VALUES 语句 8.1 ...
- SQL Server2012 T-SQL基础教程--读书笔记(5-7章)
SQL Server2012 T-SQL基础教程--读书笔记(5-7章) SqlServer T-SQL 示例数据库:点我 Chapter 05 表表达式 5.1 派生表 5.1.1 分配列别名 5. ...
- 【索引】Objective-C基础教程-读书笔记
第1章 启程 http://www.cnblogs.com/duxiuxing/p/5492219.html 第2章 对C的扩展 第3章 面向对象编程的基础知识 第4章 继承 第5章 复合 第6章 ...
- SQL基础教程读书笔记-1
查询基础 2.2 算数运算符和比较运算符 2.2.1算数运算符 + - * / 需要注意NULL 5 + NULL 10 - NULL 1 * NULL 4 / NULL NULL / 9 NULL ...
- 《Python基础教程读书笔记》
第1章 快速构造:基础知识 1.2交互式构造器 不强制分号,一行就是一行.可以加上分号 1.4数字和表达式 加.减.乘.除.整除.求余.指数.取反(-例如-2**2,**的优先级比-大) from _ ...
- 【Objective-C基础教程-读书笔记】第1章 启程
在第1章里面,作者主要以一种站在世界中心呼唤爱的姿态,给读者们打打鸡血洗洗脑,鼓励大家,投入时间学习Objective-C,值得啊! 首先,Objective-C既能用来开发OS X平台上的APP,又 ...
- Objective-C基础教程读书笔记(6)
第6章 源文件组织 到目前为止,我们讨论过的所有项目都是把源代码统统放入main.m文件中.类的main()函数,@interface和@implementation部分都被塞入同一个文件里.这种结构 ...
- SQL基础教程读书笔记-2
4 数据更新 4.1数据的插入 1.清单{①列清单 ②值清单列清单和值清单的数量必须保持一致.原则上,执行一次INSERT语句会插入一行数据对表进行全列INSERT时,可以省略表名后的列清单2.插入默 ...
随机推荐
- UVa1584 Circular Sequence
#include <stdio.h>#include <string.h> int less(char* str, size_t len, size_t p, size_t q ...
- 提高PHP编程效率
1.如果能将类的方法定义成static,就尽量定义成static,它的速度会提升将近4倍. 2.$row['id']的速度是$row[id]的7倍. 3.echo比print快,并且使用echo的多重 ...
- C# Mutex
Mutex Mutex 类似于C# lock, 区别在于一个Mutex可以在多个进程间使用.也就是说Mutex既是computer-wide又是application-wide. 注意: 获取和释放M ...
- Codeforces 116C - Party(dfs)
n个人,每个人之多有一个上司.“上司”关系具有传递性.求最少将人分成多少组,每组中的每个人的上司或者间接上司都不在该组.拿到题就用树的直径wa了一炮... 正解是有向无环森林的最长路.从每个跟节点df ...
- html加载与脚本运行中,由于html未完全加载而导致脚本找不到dom元素无法执行事件
问题: 如题,就是说alert后出现一个对话框,我没有点关闭,其他js文件或html会被加载吗,我遇到一个问题就是在页面加载时调用一个div的click事件,却没有被执行,但是在调用事件前面加上ale ...
- [LeetCode]题解(python):001-Two-Sum
题目来源: https://leetcode.com/problems/two-sum/ 题意分析: 这道题目是输入一个数组和target,要在一个数组中找到两个数字,其和为target,从小到大输出 ...
- iter, yield与enumerate的实现
模拟实现一个enumerate函数 def myEnumerate(seq, start=0): results = [] n = start for i in seq: results.append ...
- Java Socket 入门1
由程序逻辑可以看到 这是一个 客户端和服务端一对一聊天的程序 首先由服务端说第一句话然后对话才开始 且只能客户端一行话 服务端再一行话 这样往复进行 客户端若想不等服务端回应继续说话是不行的 服 ...
- Protel99se教程八:protel99se原理图设计的高级应用
在我们PCB资源网的前边的protel99se教程当中,我们给大家讲解了如何绘制一个简单的原理图,以及如何将SCH原理图转为PCB,再有就是创建SCH元件,以及如何建立protel99se封库,有了上 ...
- Linux软件安装包中devel与非devel包之间的区别
带devel(develop)的包,俗称开发包.功能上与普通包相同,但体积更大使用rpm -qi看看这两类包的区别: # rpm -qi glibc-devel-2.12-1.149.el6.x86_ ...