iOS常用调试方法之静态分析详解
前言
在iOS项目开发过程中,常用到静态分析(Analyze)、断点(BreakPoint)和控制台(Console)进行代码调试。本篇文章介绍Xcode常用调试方法之”静态分析“。
本文来自360奇舞团QiShare团队投稿。
一、简介
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也有自己的局限性,其检查结果也只是辅助开发者查找问题,真正优化代码需要开发者更多的技术经验。
好了,以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,谢谢大家对我们的支持。
相关推荐
-
详解Xcode 9 设置 iOS无线真机调试
本篇文章主要介绍了Xcode 9 设置 iOS无线真机调试,分享给大家,具体如下: 环境要求: 至少Mac OSX 10.12.6 iOS 11 Xcode 9 第一种情况 在笔者写作之前,Mac 和 iPhone 通过wifi连接的是同一个路由器,也即同一个局域网,这种情况需要的操作相对简单. 接下来进行操作: 1. "自己的工程" -> windows -> Device and Simulators ,打开设备和模拟器界面 Device and Simulators
-
iOS中CPU线程调试的高级技巧分享
前言 最近在开发直播,发现CPU性能被打满后导致CPU降频,发热严重,然后卡顿- 为了定位这个问题我们花费了至少 3天的时间 一点一点跟踪CPU的线程代码,当遇到C++的thread的时候没有符号表,只能看见一坨对象地址,除此以外连个方法名都没有的时候真是手足无措.本篇介绍一个高级调试 方法,使用符号表和相关 指令寻踪 相关代码调用,写的不好 大佬们请轻喷.代码相关过程感谢同事 陈豪的大力支持. Talk is cheap show me the code 我们的实现思路是找到动态库的首地址调用
-
iOS开发中如何优雅的调试数据库详解
背景 写代码难免出现bug. 储备些调试技能绝对能够提高你的工作效率,让bug无所遁形.相信大家应该都有所体会,我们在开发的时候,数据库的操作一直是一个很棘手的问题,后来发现Android下面有一个第三方的库还挺好用的,就模仿它搞了个iOS的,可以方便的通过浏览器查看.添加.删除.修改数据库.下面话不多说了,来一看看详细的介绍吧. 历史状况 我们来回想一下调试的过程: 如果在模拟器中调试: 找到模拟器应用中数据库的文件位置 拷回到一个比较方便打开的地方 安装一个数据库操作软件 打开数据库文件 s
-
详解使用Xcode进行iOS设备无线调试
设备环境:Mac OSX 10.12.5.iOS11.Xcode9 PS:这是WWDC2017的新功能,iOS11以上,Xcode9这是刚性要求.这个功能不好找,就记下来了 手机连接上Xcode,打开Xcode菜单:Windows->Device and Simulators.找到连接上的设备,把Connect via network选项打勾. 之后Xcode将会转一会圈圈,耐心等待一会就成功了,此时拔掉数据线,可以看到左侧的设备连接列表上手机仍在. 运行我们的项目,在设备列表中不出意外会看到我
-
基于ios逆向过程中lldb调试技巧(推荐)
假如你准备在模拟器里面运行这个,你可以在"(lldb)"提示的后面输入下面的: (lldb) po $eax LLDB在xcode4.3或者之后的版本里面是默认的调试器.假如你正在使用老一点版本的xcode的话,你又GDB调试器.他们有一些基本的相同的命令,因此假如你的xcode使用的是"(gdb)"提示,而不是"(lldb)"提示的话,你也能够更随一起做,而没有问题. "po"命令是"print object&qu
-
iOS 真机调试微信小程序
平时开发小程序可以在开发者工具中进行调试,开发者工具提供了类似 Chrome DevTools 的调试面板,对于前端开发者来说入门门槛比较低. 小程序开发完成之后,我们需要在真机上进行测试,真机调试方面小程序开发者工具有预览.远程调试和设置体验版本三大部分功能.除了这三种方式之外,我们还可以使用真机远程调试,在 iOS 上可以通过实现 Safari 调试代码,安卓中可以安装 X5 内核的 inspect 版本,开启 Chrome remote debug 模式.使用真机调试不仅可以发现开发者工具
-
iOS逆向教程之动态调试详解
前言 有时候想更了解别人App的调用流程,就需要在App运行的时候进行动态调试.动态调试指的是将程序运行起来,通过下断点.打印等方式,查看参数.返回值.函数调用流程等. 下面话不多说了,来随着小编一起看看详细的介绍吧 Xcode的动态调试原理 首先了解一下 Xcode 编译和调试器的发展.Xcode 中的编译器发展历程:GCC -> LLVM,调试器的发展历程:GDB -> LLDB . Xcode 调试安装到手机上的应用的原理:Xcode 通过 LLDB 调试器把调试指令发送到手机上的 de
-
IOS Xcode调试常用命令和断点整理
IOS Xcode调试常用命令和断点 Xcode 中的调试技巧与我们的日常开发息息相关,而这些调试技巧在我们解决Bug时,常常有事半功倍的作用,经常会用到的有各种断点 和 命令.而这些调试技巧也经常会在面试中问到,所以不知道的就来看看吧. 调试命令 在上图中,右侧绿色区域就是Log 输出区,在 Log 输出区可以使用一些命令,来辅助调试. 那有哪些调试命令呢? 想要看所有的调试命令,可以在上图的右侧区域输入help,就会列出所有的调试命令. 本文就介绍几个使用频率比较高的,其他就查看后,自行了解
-
iOS常用调试方法之静态分析详解
前言 在iOS项目开发过程中,常用到静态分析(Analyze).断点(BreakPoint)和控制台(Console)进行代码调试.本篇文章介绍Xcode常用调试方法之"静态分析". 本文来自360奇舞团QiShare团队投稿. 一.简介 Xcode的静态分析功能是在程序未运行的情况下,对代码的上下文语义.语法.和内存情况进行分析,可以检测出代码潜在的文本本地化问题(Localizability Issue).逻辑问题(Logic error).内存问题(Memery error).数
-
python实现语音常用度量方法的代码详解
语音信号处理一般都要进行主观评价实验和客观评价实验. 主观评价:邀请测听者对语音进行测听,给出主观意见得分 客观评价:根据算法来衡量语音质量 主观投票受多种因素影响,如个体受试者的偏好和实验的语境(其他条件).一个好的客观质量度量应该与许多不同的主观实验有很高的相关性 信噪比(SNR) 有用信号功率与噪声功率的比(此处功率为平均功率),也等于幅度比的平方 其中:$P_{signal}$为信号功率(平均功率或者实际功率):$P_{noise}$为噪声功率:$A_{signal}$为信号幅度:$A_
-
IOS 避免self循环引用的方法的实例详解
IOS 避免self循环引用的方法的实例详解 示例代码: // - weak & strong #define myWeakify(VAR) \ try {} @finally {} \ __weak __typeof__(VAR) VAR##_myWeak_ = (VAR) #define myStrongify(VAR) \ try {} @finally {} \ __strong __typeof__(VAR) VAR = VAR##_myWeak_ #define myStrongif
-
R语言常用两种并行方法之snowfall详解
上一篇博客(R中两种常用并行方法之parallel)中已经介绍了R中常见的一种并行包:parallel,其有着简单便捷等优势,其实缺点也是非常明显,就是很不稳定.很多时候我们将大量的计算任务挂到服务器上进行运行时,更看重的是其稳定性. 这时就要介绍R中的另一个并行利器--snowfall,这也是在平时做模拟时用的最多的一种方法. 针对上篇中的简单例子 首先是一个最简单的并行的例子,这个例子不需要载入任何依赖库.函数.对象等.相对也比较简单: library(snowfall) # 载入snowf
-
R语言常用两种并行方法之parallel详解
目录 并行计算 在模拟时什么地方可以用到并行? 怎么在R中看我们可以使用并行? parallel(简单) 由于最近在进行一些论文的模拟,所以尝试了两种并行的方法:parallel与snowfall,这两种方法各有优缺,但还是推荐snowfall,整体较为稳定,不容易因为内存不足或者并行线程过多等原因而报错. 并行计算 并行计算: 简单来讲,就是同时使用多个计算资源来解决一个计算问题,是提高计算机系统计算速度和处理能力的一种有效手段.(参考:并行计算简介) 一个问题被分解成为一系列可以并发执行的离
-
Java四个线程常用函数超全使用详解
目录 前言 1. wait() 2. join() 3. sleep() 4. yield() 5. 总结 5.1 wait和join的区别 5.2 wait和sleep的区别 前言 之前没怎么关注到这两个的区别以及源码探讨 后面被某个公司面试问到了,开始查漏补缺 1. wait() 使当前线程等待,直到它被唤醒,通常是通过被通知或被中断,或者直到经过一定的实时时间. 本身属于一个Object 类,查看源代码也可知:public class Object { 查看其源码可知,一共有三个重载的方法
-
LyScript实现绕过反调试保护的示例详解
LyScript插件中内置的方法可实现各类反调试以及屏蔽特定API函数的功能,这类功能在应对病毒等恶意程序时非常有效,例如当程序调用特定API函数时我们可以将其拦截,从而实现保护系统在调试时不被破坏的目的. LyScript项目地址: https://github.com/lyshark/LyScript 绕过反调试机制: 最常用的反调试机制就是用IsDebuggerPresent该标志检查PEB+2位置处的内容,如果为1则表示正在被调试,我们运行脚本直接将其设置为0即可绕过反调试机制. 也就是
-
iOS界面布局简化UIStackView使用详解
目录 前言 UIStackView布局思想 distribution: alignment: UIStackView用法 初始化 添加.删除子视图 排列方向 布局方式 对齐方式 间距 前言 在过去iOS页面布局较为传统,大多数人使用Frame或者AutoLayout来布局,在iOS9以后,引入了UIStackView.UIStackView是用于线性布局的控件,可以自动管理子视图布局,自动填充.它借鉴了前端的布局算法Flexbox,可以简便地实现各种页面布局. UIStackView虽然已经不是
-
Linux 中常用的Rpm命令实例详解
rpm命令是RPM软件包的管理工具.rpm原本是Red Hat Linux发行版专门用来管理Linux各项套件的程序,由于它遵循GPL规则且功能强大方便,因而广受欢迎.逐渐受到其他发行版的采用.RPM套件管理方式的出现,让Linux易于安装,升级,间接提升了Linux的适用度. 语法 rpm(选项)(参数) 选项 -a:查询所有套件: -b<完成阶段><套件档>+或-t <完成阶段><套件档>+:设置包装套件的完成阶段,并指定套件档的文件名称: -c:只列出
-
Spring Data JPA 简单查询--方法定义规则(详解)
一.常用规则速查 1 And 并且 2 Or 或 3 Is,Equals 等于 4 Between 两者之间 5 LessThan 小于 6 LessThanEqual 小于等于 7 GreaterThan 大于 8 GreaterThanEqual 大于等于 9 After 之后(时间) > 10 Before 之前(时间) < 11 IsNull 等于Null 12 IsNotNull,NotNull 不等于Null 13 Like 模糊查询.查询件中需要自己加 % 14
随机推荐
- JavaScript比较两个对象是否相等的方法
- IIS APPPOOL\DefaultAppPool登录失败怎么办
- 详解CentOS设置程序开机自启动的方法
- js判断文本框输入的内容是否为数字
- BootStrap框架个人总结(bootstrap框架、导航条、下拉菜单、轮播广告carousel、栅格系统布局、标签页tabs、模态框、菜单定位)
- 浅谈JavaWeb中的web.xml配置部署描述符文件
- jQuery插件实现文件上传功能(支持拖拽)
- Windows Powershell 变量的类型和强类型
- 调整SQLServer2000运行中数据库结构
- Jquery删除css属性的简单方法
- CSS3 media queries结合jQuery实现响应式导航
- 确保Linux安全的十招
- 详解Android权限管理之Android 6.0运行时权限及解决办法
- java导出json格式文件的示例代码
- 用PHP实现文件上传
- 轻松获得网通、电信、铁通IP地址分配段的方法
- python表格存取的方法
- 详解Vue中watch的高级用法
- Python将视频或者动态图gif逐帧保存为图片的方法
- java GUI实现学生图书管理简单实例