在这一章节中,你将学会如何调试你的代码。调试(Debugging)是开发者非常重要的工具,会调试代码可以为你节省几百个小时的时间,同时,你还将学会如何阅读苹果公司的开发文档(Apple's documentation),这个文档就是苹果公司提供的百科全书,这里有你想知道的所有答案,最后你还将学会如何给你的App增加图标和启动页面。让我们继续增加你的知识吧。
为什么要调试?(Why Debugging?)
开发软件的大部分工作都是报错然后解决问题。问题(Issues),也叫做bugs,就是你的App没有按照你预想的来运行。分析问题筛选原因检修代码的过程叫做调试(Debugging)。苹果公司甚至在Xcode中提供调试工具套件,帮助你完成调试工作。
调试(Debugging)是开发工作的一个步骤,不管你开发过多少个App,你还是需要调试代码。和微软的Word中的拼写检查相似,不会因为你已经写过500多篇论文,就表示你不会犯语法错误或者拼写错误。当你需要调试代码的时候,不要沮丧,记着,调试只是一个必须经过的步骤,能够提高你App的质量。
一般会有两类问题:compile time(编译时遇到的问题)和runtime(运行时遇到的问题)。
编译时遇到的问题(Compile-Tiem Issues)
要理解编译时遇到的问题(compile time issues)这个概念,你先要理解Xcode背后运行机制。Xcode读取swift代码然后翻译成数字0和数字1,以便让iOS模拟器能够理解。把swift编译成0和1过程,叫做compiling(编译),也就做building。
Page 163
当你的代码正确无误时,就能够通过编译,如果代码有错误,就无法通过编译,也就无法在iOS模拟器中运行。点击屏幕左上角的Play按钮开始编译。如果编译成功,程序就会在模拟器上运行,如果失败了,Xcode上会出现一个红色的报错提示。例如,看一下下面这个代码:
var total = 100 + 40
var half = totla/2
这时第二行代码会出现一个编译错误,因为没有一个叫totla的变量,所以引起一个错误,编译失败(见图6-1)。
Xcode会告诉你造成错误的原因。例如:
var total = 100+40
var half = totla/2
//Use of Unresolved Identifier 'totla'
这些原因一开始听起来有些含义模糊神秘,不过过一段时间, 就会习惯了。在这个例子中,Xcode说有个identifier,也就是有个变量,被使用了,但是没有找到这个变量。翻译一下,就是说“你正在使用一个不存在的变量”。变量totla
不存在是因为出现了拼写错误,把totla改成total,就会解决问题:
var total = 100+40
var half = total/2
//Build Successful - No Errors
遇到bug不要气馁,有些bug可以几分钟内就解决掉,有些几个小时,有些甚至需要几天来解决。但是记住,犯错出现问题和解决问题才是最好的学习方式。再也没有比看一眼bug立马解决更好的了。保持积极心态,和一点点坚持, 就能越走越远。
Page 164 | Chapter 6 : Next Steps: Debugging, Documentation, and App Icons
错误(Errors)
编译错误造成的原因可能是句法错误,获取属性值错误,或者是匹配错误类型。这些错误都会把Xcode发现然后用红点标注在出现错误的代码左边,Xcode的编译错误检查机制和微软Word的语法拼写检查机制相似,有过有错误,都会高亮显示,提出建议解决方法。
Xcode具有提供修改建议的能力,叫做Fix-It。如果出现了修改建议,出现的红点里的叹号就变成了一个白点,点击这个白点,弹窗一个菜单,呈现问题已经可能的修改方法。点击Fix-It选项,提议的修改方式就会增加到你的代码中去。
警告(Warnings)
在某些情况下,Xcode会怀疑某个地方有问题,但是仍然会运行程序。这时,Xcode就会提出警告(warnings)。有可能是变量的类型没有声明,有可能是某个变量没有被用到。如果出现了一个警告,会在响应代码左边出现黄色三角符号。点击这个黄色三角符号,显示可能出现的问题。大多数情况下,警告都是需要引起你重视的,最好和处理错误一样,处理警告的问题。
当你的App完成编译后,错误和警告的数量会在Xcode顶部出现。如果有错误,Xcode就会停止编译,然后出现编译失败的通知(见图6-2)。如果只有警告没有错误,那么Xcode会继续编译,出现编译成功的通知。所有的错误和警告都会整理到一个地方:the Issue Navigator。
Compile-Time Issues | Page 165
Xcode左侧窗口的Issue Navigator目前可用,点击Project Navigator工具栏从左起第四个按钮(三角形带一个叹号的按钮),就能打开Issue Navigator,打开后,所有的问题、错误和警告都会展示出来,点击其中一个问题,Editor就会打开相关的文件,高亮标出带问题的代码,Issue Navigator也提供问题的描述,能够更简单的找到问题所在。
运行时的问题(Runtime Issues)
Runtime就是应用正在运行界面启动。例如,运行时的问题意味着在点击某个按钮时,应用崩溃(crash)。比起解决编译时的问题,解决运行时的问题的难度更大,因为我们不太容易确定到底是哪行代码出了问题,这时候断点(Breakpoints)会帮助你。断点(Breakpoints)允许开发者临时暂停程序运行,可以一行一行的检查代码。一行一行运行的过程也就做stepping(步进)。stepping(步进)代码就像是看即时回放的慢镜头,可以一帧一帧地观看到底发生了什么。
当程序运行时遇到了无法解决问题,就会发生崩溃(crash),App停止工作用户无法使用。
断点(Breakpoints)
Editor左侧叫做gutter(栏距),在gutter上点击某行代码所在位置,就能产生一个断点(Breakpoints),在gutter上会出现一个深蓝色三角,表示在这行代码产生了一个断点(Breakpoints)(见图6-3),当程序运行到这行代码时,就会结束。
Page 166 | Chapter 6 : Next Steps: Debugging, Documentation, and App Icons
设置断点(Breakpoints)后,程序运行到此行代码结束,然后显示Debugger(调试器)。
在底部显示出一块面板叫做debug area(调试区域)(见图6-4)。调试区域有两部分:变量界面(variables view)和控制台(console)。变量界面在左边,显示当前方法中存在的变量。
右击一个变量,然后选择“Print description of variable”,把变量的细节信息显示到控制台(console)上,控制台(console)在右侧,显示开发日志(developer log)(见图6-5),可以监视App的运行情况。
Runtime Issues | Page 167
println()
方法(swift2.0之后语法已经修改为print()
了,请注意)可以将信息显示到控制台上:
printlin("Button Tapped")
println()
方法由直接把字符串的内容显示到控制台中。
使用调试器(Using the Debugger)
图6-6是变量界面中的调试工具栏,表格6-1显示的是调试工具栏中从左到右每个按钮的作用。
Page 168 | Chapter 6 : Next Steps: Debugging, Documentation, and App Icons
表格6-1 Debug toolbar 调试工具栏
Button 按钮 | Description 作用描述 |
---|---|
Show/Hide 显示/隐藏 | Debug area 调试区域 |
Enable or Disable Breakpoints开启或关闭断点功能 | Breakpoints 断点 |
Continue 继续 | Resumes app back to normal state or until next breakpoint 让App继续运行直到遇到下一个断点 |
Step Over 下一步 | Executes next line of code, like a frame-by-frame forward button检查下一行代码 |
Step Into 进入 | Moves the debugging into a method, if applicable 如果可行,进入方法中去调试 |
Step Out 退出 | Moves the debugging out of a method, if applicable 如果可行,退出方法 |
Debug View Hierarchy 调试界面等级 | Displays view for debugging interface elements and view layouts 展示调试界面元素的等级 |
Simulate Location 模拟城市地点 | Selects a city to simulate GPS coordinates 选择一个城市然模拟GPS定位 |
Method Name 方法名字 | Shows the current method being called 显示当前被调用的方法的名字 |
Step over按钮使用最为频繁,Step over可以像即时重放那样让代码一行一行执行,控制台(console)也比较常用,可以确认一个事情发生或者日志记录。
文档(Documentation)
文档是任何编程语言的圣杯,文档描述了方法、类、属性、和变量如何工作,是开发者最好的朋友,提供需要的细节描述,像方法的参数类型,返回值之类的细节。苹果公司把大量的时间和资源投入到编写文档工作中,如果你有疑问,首要就是要查询文档。
点击最上方的Window按钮,然后点击“Documentation and API Reference”(见图6-7),就打开了文档,当你编程的时候,最好能够一直打开文档。
Documentation | Page 169
文档窗口看起来有些像是网页浏览器(见图6-8)。在输入框中输入你想查询的关键词,出现结果列表。输入框左侧的三条线的按钮是内容窗格表格,这个窗格会显示与某个主题相关的所有内容,快速查询某部分内容。它左侧的按钮是显示Library Navigator,浏览文档的目录内容,再往坐的两个前进和后退按钮功能就是前进和后退了。
Page 170 | Chapter 6 : Next Steps: Debugging, Documentation, and App Icons
最后,右侧的主窗口显示选中的类、注释、参考的具体内容。拿类举个例子,首先会显示类的一个简单描述,然后列出这个类里所有的方法和属性,每个方法属性都会有描述和例子,类会描述每个参数和返回值,当显示这个方法或属性是在哪个版本时推出的(created in iOS 3.0就是在iOS3.0的时候才有的这个方法)。
示例代码(Sample Code)
文档不仅仅是显示指南文件,还提供实例代码和示例工程,研习示例工程是学习苹果技术的好方法。比如,你打开Library Navigator然后打开iOS8 library,打开User Experience然后点击Sample Code选中HelloWorld,这个示例工程是展示如何创建一个简单的程序,来接收用户输入然后显示输入信息,点击Open Project查看示例代码。
(不知道为啥我打不开啊,可能是因为这个示例工程是用OC写的,而我用的是swift?能打开的好心告诉我一下吧~)
如何最有效地使用文档(How to Get the Most Out of Documentation)
每一个优秀的程序员都会花时间精力来学习文档,这是成为高手的最好方法,既然文档这么重要,那么就介绍一下其中的一些你应该知道的小技巧吧。
如果你对某个类、关键词或者方法有疑问,把你鼠标移到上面,然后按住Option键,鼠标点击,这时就会出现一个弹出框Quick Help(见图6-9)。显示说明、解释和跳转到参考文档的链接。
Documentation | Page 171
点击参考链接,跳转到文档。或者按住Option然后双击想要查询的项目,就不会出现弹出框Quick Help而是直接跳转到文档。当然了,还可以使用Command+Shift+0快捷组合键直接打开文档。
文档中最有价值的部分是iOS Human Interface Guidelines(iOS人机界面交互指南)。解释了如何使用iOS中的每个界面元素,这个文档必须要读一下,如果你不遵循其中的要求,等你上传App到苹果市场时是会被拒的哦。
优秀的程序员都是非常熟悉文档的,把阅读文档当成编程的一部分,理解和学习文档的技能需要时时练,了解哪些框架和资源你目前能够使用。使用Library Navigator能够了解更多的主题。
App图标(App Icons)
App图标会出现在App应用市场,Home Screen手机屏幕上,以及Spotlight上。App 图标涉及多个设备和的很多尺寸,表格6-1是所有需要的App图标。
Page 172 | Chapter 6 : Next Steps: Debugging, Documentation, and App Icons
表6-2 所有的App图标尺寸
Filename 图片名称 | Image size (px) 图片尺寸 | Description 描述 |
---|---|---|
iTunesArtwork.png | 1024x1024 | App Store Listing |
Icon-60@3x.png | 180x180 | Retina HD Home Screen |
Icon-60@2x.png | 120x120 | Retina Home Screen |
Icon-76@2x.png | 152x152 | iPad Retina Home Screen |
Icon-76.png | 76x76 | iPad Home Screen |
Icon-40@3x.png | 120x120 | Retina HD Spotlight |
Icon-40@2x.png | 80x80 | Retina Spotlight |
Icon-40.png | 40x40 | Spotlight |
Icon-29@3x.png | 87x87 | Retina HD Settings |
Icon-29@2x.png | 58x58 | Retina Settings |
Icon-29.png | 29x29 | Settings |
(我正在翻译本书版本是14年12月的,那时候还没有出来iPad pro设备)
关于Retina和Retina HD的更多信息将会在第七章中详细介绍。强烈推荐把命名时使用表格中推荐的名字,如果名字没有按照规则命名,可能会产生混淆和错误。图标做好后,就添加到Xcode中去。
想要添加到Xcode中,先要点击Project Navigator中的images.xcassets,Editor编辑器的左边会有一竖栏,选择AppIcon,出现图6-10。
App Icons | Page 173
把每个图标图片拖到相应的格子中,运行App看一下iOS模拟器中的图标是否正确,iOS模拟器启动后,点击菜单栏,选择Hardware -> Home,或者快捷键Command+Shift+H,就可以看到App图标了。
启动界面图片(Launch Image)
当App启动时,出现启动界面表示应用正在启动中,这个启动界面是由一个图片构成的。如果不设置启动界面,用户会看到一篇黑色,不确定这个应用是否启动。启动界面一般是竖屏的,然后,也可以提供横屏启动界面。大多数的启动界面和打开App后的第一个界面有些相似,Facebook的App就是这样的。
Xcode会自动为你的工程创建启动界面。Launch�Screen.xib文件用来定义启动界面,可以石笋Auto Layout自动布局,这个知识会在下一章中介绍。
在这一章中,你学会了如何调试你的代码,这样能比以前更快的解决问题,还学会了如何阅读文档,读的阅读,你的进步越快,最后,你学会了如何创建App图标和启动界面。保持这样的速度,继续加油吧~