Xcode中的断点和检查变量

想象一下,您刚刚构建了一个很棒的iOS应用程序,用于存储您拥有的图书的详细信息。

该应用程序有两个主要场景-一个场景包含一个列出所有书籍的表格,另一个场景可以在其中添加或编辑书籍的详细信息。 您甚至可以使用设备的相机或通过检测书籍的条形码来添加封面图像。

现在,假设您将您的应用程序发送给了一位朋友,以获得他们的反馈,而他们的回应如下:

“添加图像并保存后,下次编辑书并保存时,书的封面似乎消失了……很奇怪吗?”

好。 这奇怪-看起来您需要进行一些调试!

在本文中,我们将探讨诊断和解决此问题的方法。 我们将特别关注断点以及检查Xcode中变量的不同技术。

下载代码

在执行任何操作之前,我们需要下载该应用程序的代码。 为此,您将从Xcode中克隆项目。

1.选择源代码->克隆。

2.在文本字段中输入存储库的URL:https://github.com/iOSAppDevelopmentwithSwiftinAction/Bookcase.git。 Xcode项目应下载。

将选择默认分支,但是我们要选择其他分支。

我们可以在Source Control导航器中选择一个分支,您可以在Xcode左侧的列中找到该分支,称为导航器区域。

3.从左侧选择第二个选项卡。 这将打开“源代码管理”导航器。

4.打开Bookcase存储库,您应该看到三个组-BranchsTagsRemotes

5.选择Remotes,然后在Origin中找到Chapter15.1b.UpdatesNeedFixing分支。 右键单击该分支,然后选择“ 签出”以签出正确的分支。 由于尚未下载此分支,因此它不会下载。

6.连接iPhone或iPad,然后单击左上角的播放按钮,检查是否可以在设备上运行应用程序。

7.选择跳过按钮绕过入门。

复制问题

您需要做的第一步检查是尝试重现该问题。 有关您的朋友描述的问题的直观表示,请参见图1。

让我们尝试复制该错误。

  1. 从列表中选择一本书。
  2. 选择相机按钮,添加封面图像,然后选择保存。

现在,您应该在主表场景中看到封面图像。 到目前为止一切都很好!

3.再次打开同一本书,然后选择保存。 书籍图像返回到默认封面图像。 奇怪是对的! 可能会发生什么?

您直接怀疑是由于某种原因,当BookViewController生成要保存的书时,没有使用现有的书封面。 通过检查BookViewController类中的bookToSave变量,在touchSave方法中确认这touchSave

与Xcode中的情况一样,检查变量内容的方式有很多。 现在,让我们看一下一些内容,从您可能已经见过的方法print方法开始。

用print检查变量

要检查bookToSave变量,让我们使用print方法将其内容打印到控制台。

1.在touchSave方法调用dismissMe之前,打印bookToSave变量:

print(“Saving book: \(bookToSave)”)

2.再次运行该应用程序,再次向书中添加封面图像,选择保存,重新打开书并选择保存。

这次,book对象应该打印到控制台,例如:

 储蓄书:书籍(书名:“英国退欧岛上的五个人”,作者:“ Enid Blyton”,等级:3.0,isbn:“ 9781786488077”,注释:“”,图片:可选(,{128,202 }),backgroundColor:UIExtendedGrayColorSpace 1 1,primaryColor:UIExtendedGrayColorSpace 0 1,detailColor:UIExtendedGrayColorSpace 0 1) 

好吧,那太好了。 默认情况下,您会看到对象的每个属性的值,直至其背景色。 但是,有时在打印对象时,可能不需要查看其所有最后细节。 您可能更喜欢只看重要的东西。 例如,通过书名和作者来标识一本书可能就足够了。 要解决此错误,您可能还想查看这本书是否有封面。

在打印对象时,有一个巧妙的小技巧可以调整输出的字符串。 如果您的自定义类型采用CustomStringConvertible协议,则可以提供一个描述属性,该属性将您的对象描述为String,并且print将自动使用它。

3.现在设置Book结构(您可以在Model组中找到它)以采用CustomStringConvertible协议:

 结构体书:Codable ,CustomStringConvertible { 

4.在Book结构中添加一个description属性,该属性返回标题,作者以及有关Book是否具有封面图像的消息:

注意 请注意不要再次单击断点-这将使指示灯变为浅蓝色,并且断点将切换为禁用状态。

另一个可能值得分析的有趣地方是在BookViewController类收到要编辑的Book对象之后。

2.使用相同的技术,在展开book对象之后,向BookViewControllerviewDidLoad方法添加第二个断点。

3.再次运行您的应用,这次点击一本没有封面的书。 应用应立即在您在viewDidLoad方法中指定的断点处暂停。

调试导航器和调试区域会自动为您打开,并且暂停的执行行以绿色突出显示。 参见图3。

高级断点

最常见的情况是,您将使用断点来暂停特定代码行的执行,但是断点能够执行更多操作。

例如,有些断点会在发生特定类型的异常时中断执行(称为异常断点)。 还有一些断点,只要在某个类类型的所有子类上调用特定方法时就会中断执行(称为符号断点)。 您将需要在断点导航器中添加这些类型的断点。

可以将断点设置为仅在满足特定条件时或在特定次数之后触发。 可以将断点设置为也可以用于执行一个或多个动作-例如输出到控制台或播放声音。 具有讽刺意味的是,断点也不一定会中断执行-如果您愿意,在执行操作后,断点可以自动继续。

通过双击源代码编辑器或断点导航器中的断点指示器来编辑断点。