级别: ★☆☆☆☆
作者: Xs.H https://www.jianshu.com/c/b3bd94559163
审校: QiShare 团队 https://www.jianshu.com/c/b3bd94559163
在 iOS 项目开发过程中, 常用到静态分析 (Analyze), 断点(Breakpoint) 和控制台 (Console) 进行代码调试. 本篇文章介绍 Xcode 常用调试方法之 "静态分析".
一, 简介
Xcode 的静态分析功能是在程序未运行的情况下, 对代码的上下文语义, 语法, 和内存情况进行分析, 可以检测出代码潜在的文本本地化问题 (Localizability Issue), 逻辑问题(Logic error), 内存问题(Memery error), 数据问题(Dead store) 和语法问题 (Core Foundation/Objective-C) 等. 功能入口在 Xcode 菜单栏 -> Product -> Analyze(Command+Shift+B). 图示如下.
二, 文本本地化问题
当工程 Target -> Build Settings -> Static Analyzer 下的 Missing Localizability 设置为 YES 时, 使用 Analyze 功能后可以发现一些控件会提示文本本地化问题 User-facing text should use localized string macro. 图示如下:
按照提示, 使用 NSLocalizedString(<#key#>, <#comment#>)修饰文本即可修复, 图示如下:
或者, 将 Missing Localizability 设置为 NO 也可以. 图示如下:
三, 逻辑问题
使用 Analyze 可以分析出来代码中潜在的逻辑问题. 比如直接使用 NSNumber 的对象作为条件时, 会得到提示 Converting a pointer value of type 'NSNumber *' to a primitive boolean value; instead, either compare the pointer to nil or call -boolValue. 图示如下:
根据提示, 我们有两种修改方式, 图示如下:
虽然这两种修改方式都能解决问题, 但不完全一样, 要注意其中的差别, 选择需要的使用.
四, 内存问题
虽然 ARC 帮助开发者管理了大部分的内存问题. 但像 CGImageRef 等 C 系列的代码还需要开发者管理内存. 这些内存问题在编译过程中很难发现, 但使用 Analyze 可以给出相应的提示. 图示如下:
上图中有两处和内存相关的提示, 开发者可以按照提示进行相应的修改. 图示如下:
五, 数据问题
在编码过程中, 一些数据问题可以通过 Analyze 很好的提示出来. 比如下图:
上图中的 string 被提示在初始化后从未被用到. 是因为第二部的赋值操作为 string 重新申请了内存. 这时, 开发者去掉第一步初始化方法即可. 图示如下:
六, 语法问题
在重写类的 init 方法时, 有时会手误写出语法问题, 这时可以使用 Analyze 检测出问题. 图示如下:
根据提示自己检查可以知道是 if 语句写错了, 多了一个 =. 修改如下:
总结
上述几部分内容只是对 Analyze 功能的举例, 其实际能检测出的问题会更多. 另外, Analyze 也有自己的局限性, 其检查结果也只是辅助开发者查找问题, 真正优化代码需要开发者更多的技术经验.
小编微信: 可加并拉入《QiShare 技术交流群》.
关注我们的途径有:
- QiShare(简书) https://www.jianshu.com/u/3db23baa08c7
- QiShare(掘金)
- QiShare(知乎) https://www.zhihu.com/people/edit
- QiShare(GitHub) https://github.com/QiShare
- QiShare(CocoaChina) http://www.cocoachina.com/bbs/u.php?tid=658244
- QiShare(Stack Overflow) https://stackoverflow.com/users/10118400/qishare
- QiShare(微信公众号)
来源: https://juejin.im/post/5c7ce86351882577cb24b223