前语

  开发者们在运用Objective-C开发过程中难免会遇到各种类型的bug或难题,而熟练运用IDE东西进行调试无疑会进步开发效率,这儿我总结了常用的调试技巧。

  接下来我会从以下几个方面逐一介绍:首要简略介绍Xcode调试需求关注的东西条,这儿断点东西条会被放入后续断点相关的内容中;接下来会叙述项目躲藏漏洞排查“利器”——代码静态剖析;然后咱们会将留意力集中在断点调试上;光有断点还不够,我还弥补了Log的运用,在特定场景运用有意想不到的作用;作为静态剖析的对照,我简略介绍了代码动态剖析及其运用;最终本文会供给一些调试相关的杂项内容当做弥补。后续我会将Objecttive-C简称为OC。由于涉及面较广,我更期望读者当它是一个索引,依据目录找到感兴趣的内容,给到读者一些思考启示。

1 Xcode东西条了解

  工欲善其事必先利其器,在介绍OC调试前,先了解Xcode中左上角的东西栏,后续内容会要点关注红框标示出的四个部分。

Objective-C调试技巧——iOS开发者的Debug指南

  • 项目导航器(Project navigator):办理项目中的文件资源;
  • 版别操控导航器(Source Control navigator):检查分支文件修正状况以及项目库房信息,如分支名、暂存更改以及长途分支状况;
  • 符号导航器(Symbol navigator):项目中的可辨认符号如类名、办法以及变量名都能够在这儿检查;
  • 文件查找导航器(Find navigator):查找项目中的某个文件以及方位;
  • 问题导航器(Issue navigator):能够检查项目在构建或运转时呈现的问题或许正告;
  • 测验导航器(Test navigator):项目运转时能够检查CPU、内存以及磁盘等的占用状况,便利后续优化,若增加断点还能够检查仓库调用信息;
  • 断点导航器(Breakpoint navigator):便利办理项目中参加的断点,快速定位断点方位;
  • 陈述导航器(Report navigator):检查项目在构建运转以及调试时的日志信息;

2 代码静态剖析

  代码静态剖析经过扫描代码,查找违背预编程规矩的问题,如内存泄露和缓冲区溢出,能够有用进步代码质量,值得留意的是Xcode中的静态代码剖析适用目标只有C、C++、Objective-C,除此之外如代码追寻和功用检测的作业应结合instruments运用,后边会介绍instruments及其运用。接下来咱们会介绍怎么翻开代码静态剖析的功用以及怎么运用它解决常见问题。

2.1 运用办法

一般快捷键为 Command + Shift + B , 也能够经过Xcode 顶部东西栏挑选Analyze。

Objective-C调试技巧——iOS开发者的Debug指南

履行之后便能够在问题导航区看到问题提示,双击后能够直接定位到代码处,能够看到右边红框的提示即为逻辑过错,这儿漏掉了一个父类办法的调用。值得留意的是由于是静态剖析,所以并不能检测出一切过错,且存在误报危险,比如这儿的左面红框提示controller4并未运用,其实最终在运转时状况UI会将其从数组中取出并烘托;

Objective-C调试技巧——iOS开发者的Debug指南

2.2 静态代码剖析能够解决的常见问题

  • 逻辑缺点

    Objective-C调试技巧——iOS开发者的Debug指南
    能够看到这儿回来了一个未初始化的值,与此一起IDE也会提示有变量并未初始化。

  • 内存办理过错

    Objective-C调试技巧——iOS开发者的Debug指南

    这儿检查到回来了一个空指针,可是函数并不期望回来一个空值。这儿检查函数编写逻辑也存在过错,增加默许判断保证回来值不为空即可。

    Objective-C调试技巧——iOS开发者的Debug指南

    当程序中包括潜在的内存泄露的问题时,静态代码剖析也能够检测,这儿CoreGraphics结构下的CGColor需求咱们手动办理内存,运用 CGColorRelease 开释即可。

  • 无用存储逻辑
    这儿首要是指永久不会访问的变量以及永不会履行的代码。

    Objective-C调试技巧——iOS开发者的Debug指南

    这儿提示 Value stored to ‘cellNum’ is never read 阐明代码能够优化,直接回来需求的数值,能够去掉cellNum这个暂时变量。

  • API滥用

    Objective-C调试技巧——iOS开发者的Debug指南
    这儿的问题首要是忽略了一些OC目标的运用规矩,数组中不允许增加空值,除此之外字典中也不允许设置key和value为空值。

  • Xcode13新增检查特性
    在Xcode13中静态代码剖析器晋级,能够捕获更多的逻辑过错如死循环、NSAssert副作用、无用的冗余代码等。这儿咱们以NSAssert副作用为例,编写代码后运用 Command + Shift + B 敞开静态代码剖析,能够看到提示condition中的句子会在release版别下丢掉,所以不应该将变量修正的代码放入condition中履行,这儿将对number的修正代码移至NSAssert函数之外即可,不仅是Objective-C中的NSAssert函数,C和C++中的Assert函数也能够捕获反常。

    Objective-C调试技巧——iOS开发者的Debug指南

3 LLDB常用指令与断点运用

  断点一般能够分为一般断点,条件断点,符号断点,反常断点,watch断点,线程断点。在叙述各个断点的运用功用之前先介绍调试区域东西栏以及常用LLDB指令。

3.1 断点东西栏

在此咱们仍是先了解一下断点相关的东西区及其用途。

Objective-C调试技巧——iOS开发者的Debug指南
图中各标签对应意义如下:

  • 1——断点开关(Deactivate breakpoint),当为蓝色时断点翻开,点击后蓝色消失,断点封闭;
  • 2——持续履行(Continue program execution),点击后会跳转至下一个断点,若没有则程序进入运转状况;
  • 3——单步运转(Step over),单步履行程序,便利调查每一步的运转状况,当遇到子函数不会进入而是履行完进入下一条句子;
  • 4——跳入函数(Step into),进入子函数中持续履行;
  • 5——跳出函数(Step out),结束子函数履行跳转到上一级函数;
  • 6——层级视图(Debug View Hierarchy),检查程序当时页面的UI层级视图,定位视图组件层级联系;
  • 7——内存结构图(Debug Memory Graph),直观检查是否存在如内存走漏的问题;
  • 8——调试器外观设置(Environment Overides),设置真机或模仿器的深淡色以及字体字号等外观元素;
  • 9——模仿定位(Simulate Location),设置真机或模仿器的定位方位;
  • 10——断点处实例变量信息(Variables View);
  • 11——LLDB终端,履行相关指令,清屏快捷键为 Command + K ;

3.2 常用LLDB指令

  • help指令——检查LLDB供给的指令及其作用

    Objective-C调试技巧——iOS开发者的Debug指南

    当咱们想检查某个详细指令的用法时能够运用 help commandName,能够看到其提示的诸多搭配用法以及意义。

    Objective-C调试技巧——iOS开发者的Debug指南

  • command指令
    command指令首要用来办理自定义的一些LLDB指令,常常结合script或许source运用,command script import filePath 导入自定义的指令,而 command source 指令用于履行指定文件中的LLDB指令。LLDB会在几个特定方位预加载一些内容,而~/.lldbinit文件归于其间之一。若本地并无此文件能够自行创立,然后输入以下内容并保存,其间 fblldb.py 为facebook开源的chisel供给的定制LLDB指令集合的进口文件,详细内容以及装置办法点击这儿,其间也包括怎么增加个人定制的指令。

    command script import path/to/fblldb.py
    

    然后翻开LLDB调试窗口,输入以下指令,如此便能够调用chisel供给的调试指令。除此之外,command source 指令还能够导入个人定制的.lldbinit文件,然后防止运用高达(Gundam)动态生成的.lldbinit文件,无法包括自定义装备项,而在.lldbinit文件中增加 command script import 指令也能够算作自定义装备的一种。

    command source ~/.lldbinit
    
  • p指令——打印根本数据类型

    Objective-C调试技巧——iOS开发者的Debug指南

  • po(print object)指令——打印目标

    Objective-C调试技巧——iOS开发者的Debug指南

    除此之外po指令还能和oc中的办法结合运用。

    Objective-C调试技巧——iOS开发者的Debug指南

    当自定义一个类时,调用po指令。

    Objective-C调试技巧——iOS开发者的Debug指南

    这时并没有显现咱们需求的信息,需求重写KSEText类的debugDescription办法。

    Objective-C调试技巧——iOS开发者的Debug指南

    再次履行po指令。

    Objective-C调试技巧——iOS开发者的Debug指南

  • call指令——动态调用函数
    履行指定函数,在不重新编译的状况下更改视图,除此之外,call指令相同能够履行表达式

    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南

  • expr指令(expression)——履行指定的表达式
    若履行下述操作呈现报错提示能够运用 expr videoController.tabBarItem.title = [NSString stringWithUTF8String:"短视频"] 来解决(犯错原因)。

    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南

  • image指令——查找反常地址
    这儿咱们模仿数组越界的状况,接着运用image指令查找犯错方位(当然后边会介绍运用反常断点直接定位),而 image list 能够检查当时项目一切引进的库,常用于检查某个插件是否注入自己的项目。 模仿代码如下。

    Objective-C调试技巧——iOS开发者的Debug指南

    下面是犯错的提示信息,能够看到前面的CoreFoundation和libobjc.A.dylib和咱们联系不太大,能够直接从序号4开端查。

    Objective-C调试技巧——iOS开发者的Debug指南

    履行 image lookup -a(image lookup –address),能够看到Summary部分提示了犯错方位为AppDelegate.m文件中的53行18列。

    Objective-C调试技巧——iOS开发者的Debug指南

  • bt指令——打印线程仓库信息 bt all 打印一切线程仓库信息

    Objective-C调试技巧——iOS开发者的Debug指南

    当只需求部分仓库信息时,能够在 bt 指令后边增加详细打印的行数信息。

    Objective-C调试技巧——iOS开发者的Debug指南

3.3 断点运用

  • 一般断点
    在代码中某一行点击最前面的数字就能够增加一般断点,当程序履行至断点处便暂停履行,留意断点对应的程序句子是没有履行的。从下图中能够看到,程序目前暂停在了36行,且前面的断点标签即数字1所指的方位是亮蓝色,当再次点击图标会变暗,状况变为disable;

    Objective-C调试技巧——iOS开发者的Debug指南

    数字2指向的按钮功用为跳转至下一个断点,当后续没有断点时,程序会进入运转状况,如下所示,后边的按钮也会进入禁用状况。

    Objective-C调试技巧——iOS开发者的Debug指南

    当咱们增加多个断点想要一致办理时,便可经过左上角的断点导航器检查,双击则跳转至断点处。一般断点能够结合LLDB指令运用,排查代码逻辑是否契合预期。

    Objective-C调试技巧——iOS开发者的Debug指南

    而点击左上角的调试导航器图标则能够检查程序运转的内存CPU等资源的占用状况,除此之外还能够检查当时线程的函数调用栈;

    Objective-C调试技巧——iOS开发者的Debug指南

    如下图所示,从左面的仓库调用联系能够看到,main 函数直接调用了 KSECollectionViewController的办法 [collectionView:cellForItemAtIndexPath:],然后[collectionView:cellForItemAtIndexPath:] 办法调用 GTReuseableCell的 [initWithFrame:]办法。

    Objective-C调试技巧——iOS开发者的Debug指南

  • 条件断点
    增加条件断点,咱们能够在原先一般断点的根底上进行编辑修正使其成为条件断点。右键断点挑选“Edit Breakpoint…”

    Objective-C调试技巧——iOS开发者的Debug指南

    在Condition一栏增加咱们设想的逻辑条件,然后运转程序,当契合断点条件时,程序便会停留在断点处。

    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南

    当然咱们还能够在契合断点条件时履行指定的动作,点击Add Action进入挑选界面。

    Objective-C调试技巧——iOS开发者的Debug指南

    点击红框框选按钮,能够看到有六个选项,各自作用分别为:

    • AppleScript:履行脚本文件;
    • Capture GPU Workload:用于OpenGL ES调试,捕获断点处GPU当时制作帧;
    • Debugger Command:和操控台中输入LLDB调试指令共同;
    • Log Message:输出自定义信息至操控台;
    • Shell Command:接纳指令文件及相应参数列表,Shell Command是异步履行的,只有勾选“Wait until done”才会等待Shell指令履行完再履行调试;
    • Sound:断点触发时播放声响;

    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南

    除此之外,当咱们在循环中设定断点后能够运用Ignore选项越过前面N次,直接检查需求的信息。

    Objective-C调试技巧——iOS开发者的Debug指南

    而下方的Options选项选中后断点不会终止程序履行。

    Objective-C调试技巧——iOS开发者的Debug指南

  • 符号断点
    对一个办法下断点,当程序调用此办法时触发断点,这儿能够是OC办法或许C++函数,常用于调试第三方库,给相应函数下断点,检查程序当履行流程。这儿增加办法比较之前并不相同,这儿先点击左上方的断点导航东西图标,进入断点检查界面。

    Objective-C调试技巧——iOS开发者的Debug指南

    点击左下方的”+“按钮,然后选中Symbolic Breakpoint…进入符号断点增加界面。

    Objective-C调试技巧——iOS开发者的Debug指南

    在输入符号时能够只输入函数名,也能够按[类名 函数名]的办法输入,还能够在前面加上类办法或许实例办法修饰符。

    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南

  • 反常断点(大局断点)
    用于快速定位由于程序抛出反常而导致退出,如常见的数组越界,增加办法同符号断点,选中止点导航器,点击左下角“+”号,挑选Exception Breakpoint…,随后进入反常断点设置界面。

    Objective-C调试技巧——iOS开发者的Debug指南

    这儿咱们首要装备两个当地,Exception和Break,Exception能够挑选Objective-C、C++以及All,值得留意的是,当程序运用反常来安排结构逻辑,这时分挑选All会频频触发反常,所以这种状况更适合挑选Objective-C;而Break首要挑选在抛出反常仍是捕获反常的时分断点。

    Objective-C调试技巧——iOS开发者的Debug指南

    这儿仍是以数组访问越界的比如,演示反常断点怎么定位问题方位。当咱们增加反常断点后履行程序得到如下图所示成果,比较image指令,反常断点会直接跳转至过错代码方位并清晰指出反常触发原因。

    Objective-C调试技巧——iOS开发者的Debug指南

  • 线程断点
    线程断点适用在调试多线程代码的时分,一段代码或许会被多个线程一起履行,设置办法为,首要在代码处增加一般断点,然后获取输入指令thread info 获取线程id,然后在LLDB中输入指令 breakpoint set -f filename -l line_number -t tid

    Objective-C调试技巧——iOS开发者的Debug指南

    履行 breakpoint list 指令能够检查当时包括的一切断点,由于设置断点是逻辑断点,而一个逻辑断点对应一个或多个方位断点,当载入新的代码时也会一起更新方位断点,逻辑断点和方位断点运用“.”切割。

    Objective-C调试技巧——iOS开发者的Debug指南

    当想禁用或许删去断点时能够履行指令breakpoint disable/delete breakpoint_number

    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南

  • Watch断点
    常用于盯梢某个变量产生的改变,当产生改变时触发断点。设置办法为,在变量第一次呈现的方位新建一般断点,然后在Variables View窗口选中需求监控的变量并右键,挑选Watch “_text”,这时便能够在断点导航器中检查到新建的Watch断点。

    Objective-C调试技巧——iOS开发者的Debug指南
    Objective-C调试技巧——iOS开发者的Debug指南

    当被监控变量产生改变时便会触发断点,并在LLDB终端显现,并包括新旧值比照。

    Objective-C调试技巧——iOS开发者的Debug指南

    持续履行,能够看到操控台输出后续改变的监测信息。

    Objective-C调试技巧——iOS开发者的Debug指南

    这时的信息是十六进制,若需求检查其详细意义,则能够运用po指令。

    Objective-C调试技巧——iOS开发者的Debug指南

    在实践开发中,或许需求运用逆向工程的办法来观测某个变量的改变,这个时分咱们能够运用LLDB的指令行来增加Watch 断点,优点在于能够直接运用变量地址进行监测,指令格局为 watchpoint set expression address ,删去Watch断点能够运用 watchpoint delete <cmd-options> [<watchpt-id | watchpt-id-list] ,的可选参数为 -f (force)。

    Objective-C调试技巧——iOS开发者的Debug指南

3.4 调试比如

这儿咱们测验运转程序,运用 Command + R 指令,但程序构建失败,报错如下,咱们找到和咱们密切相关的部分,这儿咱们优先定位红框标出的部分。

Objective-C调试技巧——iOS开发者的Debug指南

运用image lookup -a 0x00000001049707ae 指令查找犯错方位,信息如下。

Objective-C调试技巧——iOS开发者的Debug指南
感觉对咱们协助不大,这儿main函数是主进口,也是项目初始化生成的部分。

咱们测验运用大局反常断点取得其他的反常信息。这儿新建反常断点(Exception Breakpoint),参数运用默许值。再次运转程序得到以下信息,点击绿色断点信息将其翻开,能够看到提示“UITableView dataSource returned a nil cell for row at index path:…”,咱们的TableView回来了一个空值导致了程序崩溃。这儿咱们能够自己定位代码中哪里有运用过TableView也能够直接运用静态代码剖析。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

由于程序构建就崩溃,咱们优先测验运用静态代码剖析检查过错。这儿运用 Command + Shift + B 指令,得到如下提示,也帮咱们定位到了代码问题所在,在调用[tableView: cellForRowAtIndexPath:]办法时回来了空值。所以咱们需求修正代码逻辑,在最终弥补默许回来值但不能为空,增加一个else句子。

Objective-C调试技巧——iOS开发者的Debug指南

代码修正如下所示,履行程序,成功运转,可是最终TableView并没有显现咱们想要的成果。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

这儿应该是存在内在逻辑过错,所以需求凭借断点排查问题。这儿咱们分别在 [tableView:numberOfRowsInsection:] 和 [tableView:cellForRowsAtIndexPath:] 办法的回来处增加一般断点,由于这样咱们便利检查最终的回来值,断点所在行的代码是还未履行的。除此之外咱们还在 [tableView:cellForRowsAtIndexPath:] 办法的if句子最初处增加断点,便利咱们检查indexPath变量的值。

Objective-C调试技巧——iOS开发者的Debug指南

咱们先逐一排查回来值是否存在反常,这儿增加断点后,程序便会停留在断点处,咱们再运用po指令输出咱们想检查的值。这儿咱们先检查cellNum的值为2,并无反常,咱们再检查indexPath变量中的item特点发现为空,则需求在程序中增加兜底逻辑,让最终的cell回来非空值,这儿在第二张图中也能够印证左面variable窗口cell最终依然是空值。图中为后续增加的else句子。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

点击持续按钮,让断点往下履行,再次输出indexPath的item特点,并无反常。履行完断点后便能够看到tableview显现了一行成果。

Objective-C调试技巧——iOS开发者的Debug指南

Objective-C调试技巧——iOS开发者的Debug指南

可是上面一行仍是没有信息填充肯定是不契合预期的,持续调试。

这儿咱们能够聚焦调试导航栏,检查程序调用的仓库信息,发现这儿它存在一个预生成逻辑,最初会生成一个大局的cell便利后边复用(TableView中的cell需求注册后运用,这样能够在本来cell的根底上修正少数显现信息便能展现新的cell,实现复用,极大提升功用)。

Objective-C调试技巧——iOS开发者的Debug指南

打印第一次回来的cell的信息发现回来的text特点都为空。

Objective-C调试技巧——iOS开发者的Debug指南

当持续履行断点,再次打印cell相关的text信息,能够得到以下成果。

Objective-C调试技巧——iOS开发者的Debug指南

结合代码能够知道,当indexPath.item值为1时,这儿会运用懒加载生成cell然后赋值。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

由此咱们能够得到一个结论,第一次回来的是TableView创立的大局cell可是text特点值为空,这儿咱们需求给第一次创立的大局cell给一个合理的初值,然后履行代码,问题解决。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

4 Log的运用

  尽管断点功用强大,但这儿仍是需求弥补一样不可或缺的东西——Log。有的时分调试的时分bug无法复现,一旦封闭调试,bug便会呈现。这一般是呈现在多线程中,调试形式影响了多线程的履行。所以咱们需求凭借Log去检查程序履行次序是否契合预期。这儿咱们需求凭借pch(Precompiled header)文件设定咱们的打印操作怎么履行,至于pch文件是什么以及有何作用能够看这篇文章,Xcode6之后需求手动增加pch文件,增加办法看这儿,完成第一步即可,这儿着重介绍怎么在pch文件中书写Log规矩以及在项目中引进pch文件。

当咱们在项目中生成了后缀为.pch的文件后,双击翻开能够看到以下描述。

Objective-C调试技巧——iOS开发者的Debug指南

咱们在#define和#endif中心增加需求的宏,这儿咱们增加以下内容。第11行的DEBUG标识能够协助咱们区别Debug和Release状况,这样在软件发布时日志信息便不会再打印。第12行中的KSELog为打印的办法名,能够自己定义。这儿增加了文件名以及行数的信息打印,便利后续检查Log日志定位问题。

#ifndef KSELog_pch
#define KSELog_pch
#ifdef DEBUG
#define KSELog(...) \
NSLog(@"%@第%d行:%@\n---------------------------",[[NSString stringWithFormat:@"%s",__FILE__] componentsSeparatedByString:@"/"][[[NSString stringWithFormat:@"%s",__FILE__] componentsSeparatedByString:@"/"].count-1], __LINE__, [NSString stringWithFormat:__VA_ARGS__]);
#else
#define KSELog(...)
#endif
#endif /* KSELog_pch */

之后咱们需求在项目中引进pch文件。首要咱们需求翻开项目的target找到Apple Clang – Language,这儿能够运用过滤器快速定位。

Objective-C调试技巧——iOS开发者的Debug指南

然后咱们需求将 Precompile Prefix Header 特点置为Yes,除此之外需求在Prefix Header部分增加pch文件的绝对路径,这儿能够凭借Finder和Terminal快速获取文件路径,将Finder中的文件拖入Terminal便能够得到打印的路径信息。这儿需求双击箭头指向的部分,进入编辑形式,将复制的路径张贴进去即可。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

作用检查。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

5 Instruments

  Instruments是功用强大的功用检测和代码追寻东西,常用于内存泄露检测,功用剖析,支撑多线程调试,能够将录制的图形界面操作和Instruments保存为模板,供今后访问运用。由于Instruments供给的功用较多,无法一一列举,这儿首要介绍Leaks模版的运用。首要本文会简要阐明Instruments供给了哪些首要功用,然后聚焦于Leaks模版的运用。翻开办法为,点击顶部东西栏的Product,然后挑选Profile即可。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

5.1 首要功用(基于Xcode 13.4)

常用模板:

  • Allocations:用来检查内存分配,盯梢过程的匿名虚拟内存和堆的目标供给类名和可选保存/开释历史
  • Leaks:一般用来检查内存运用状况,检查走漏的内存,并供给了一切活动的分配和走漏模块的类目标分配计算信息以及内存地址历史记录
  • Time Profiler:剖析代码的履行时刻,履行对体系的CPU上运转的进程低负载时刻为根底采样
  • Zombies:检查是否访问了僵尸目标

  • Blank:创立一个空的模板,能够从Library库中增加其他模板
  • Activity Monitor:显现器处理的CPU、内存和网络运用状况计算
  • Animation Hitches:动画监督,此模板经过时刻剖析来衡量应用程序图形功用以及进程的CPU运用状况
  • App Launch:启动问题,能够用于检查App的启动过程,然后能够针对性的对启动速度进行优化
  • Core Data:监测读取、缓存未射中、保存等操作,能直观显现是否保存次数远超实践需求
  • CPU Counters:协助开发者定位CPU占用高的线程和函数,来优化App的CPU功用问题
  • CPU Profiler:周期性的CPU负载剖析器,运用硬件功用监测中止来供给牢靠的功用监测,无论代码运转在高速仍是节能的CPU上
  • File Activity:文件活动,此模板监督文件和目录活动,包括文件翻开/封闭调用、文件权限修正、目录创立、文件移动等
  • Game Performance:便利开发者了解对游戏运转体现和帧率影响至关重要部分代码的运转状况
  • Logging:一致的日志办理体系,便利将日志和头绪可视化。引进归档日志文件时的默许模版
  • Metal System Trace:金属体系盯梢,Metal System Trace经过供给来自应用程序、驱动程序和GPU层的盯梢信息,介绍了iOS、tvOS和macOS Metal应用程序的功用
  • Network:剖析应用程序怎么运用TCP / IP和UDP / IP衔接运用衔接仪器。便是检查手机网速的。(这个最好是真机)
  • SceneKit:概述应用程序对SceneKit的运用。确定进入每个帧的作业类型,例如动画、物理、场景挑选和烘托
  • System Trace:体系盯梢,操作体系中产生的事情的一个全面的观念。了解怎么跨cpu调度线程,了解体系调用和虚拟内存过错怎么影响应用程序的功用

5.2 Leaks模版

如上所述,Leaks模板首要用来检测内存分配状况,查探是否产生了内存走漏,一般和Allocations结合运用。这儿以Xcode 13.4版别为例,演示Leaks模板的运用。首要咱们在示例代码中增加一段会引发内存走漏的代码,如下所示。咱们简略定义一个结构体,然后模仿申请内存但不开释的状况,由于ARC只针对NSObject,所以这儿的内存空间是需求手动收回的。

Objective-C调试技巧——iOS开发者的Debug指南

咱们按照先前提示过程翻开Profile界面,挑选Leaks,然后进入剖析界面。留意此时代码是没有履行的,需求点击剖析界面左上角的赤色同心圆,开端程序的检查剖析。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

剖析界面如下所示,上面一栏Allocations是剖析代码的内存分配状况,下面一栏Leaks是检测是否产生了内存走漏,绿色标识指明暂未发现内存走漏,赤色标识表明检测到产生了内存走漏。这儿咱们以C语言中的结构体申请但不开释为例,演示Leaks模板的运用。

Objective-C调试技巧——iOS开发者的Debug指南

示例代码如下,重写KSEViewController的Init办法,增加内存申请代码。逻辑为在主界面点击跳转到KSEViewController对应的界面,然后回来,由于结构体Book为自定义结构,需求手动开释,若回来到主界面未开释内存则会被检测到内存走漏。

Objective-C调试技巧——iOS开发者的Debug指南

留意运用Instruments模版需求先在Xcode中编译运转,然后按过程翻开模版检测。这儿能够看到在Leaks一栏呈现了赤色标识,咱们点击右下方的Stack Trace中的仓库记录,跳转到对应含有内存走漏危险的代码处,修正Bug。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

6 调试弥补

6.1 view hierarchy的运用

在进行UI界面开发时,常常需求调查页面层级联系以及方位联系,这时就能够运用Xcode中自带的Debug View Hierarchy,翻开办法为运转项目程序后点击下方的Debug View Hierarchy,等待程序加载完毕后,就能够看到。

Objective-C调试技巧——iOS开发者的Debug指南

Objective-C调试技巧——iOS开发者的Debug指南

  • 1——Adjust the spacing between the views:调整视图间的空隙,一般是由2D视图转变为3D视图;
  • 2——Show/Hide Clipped Content:展现或许躲藏当时界面没有被展现的内容;
  • 3——Show/Hide Constraints:展现或许躲藏界面束缚;
  • 4——Adjust View Mode:调整视图形式,可选仅内容展现、仅线框展现以及内容和线框一起展现;
  • 5——Change canvas background color:改变画布的布景色彩,深色形式和淡色形式,支撑真机;
  • 6——Orient to 2D/3D:调整视图为2D或许3D形式
  • 7——Adjust the visible range views:调整可见的视图规模;

6.2 真机截图

实践开发中,有的时分需求给产品或许测验人员展现界面作用,这个时分就能够运用Xcode中的截图功用,当咱们挑选顶部导航栏的 Debug 选项,然后找到 View Debugging ,最终点击 Take Screenshot of xxx的iPhone ,这样就能取得存放在桌面方位的真机截图。

Objective-C调试技巧——iOS开发者的Debug指南
Objective-C调试技巧——iOS开发者的Debug指南

总结

本文首要结合了个人的经历和查阅的材料,期望能对iOS的开发者们有所协助,在这儿找到需求的Debug技巧。如果内容有所缺乏,还请批评指正,有任何问题,也期望多多留言,共同探讨进步!

hi, 我是快手电商的小毅

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

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

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