Xcode 断点调试 及 内存泄露检测
2016-01-14 09:38
316 查看
1 对于所有异常添加Global BreakPoint(全局断点)
当你的应用异常或者崩溃的时候Xcode喜欢做的一件事情是直接跳到主函数,就像第一个调试技巧中用到的那个例子一样。如果异常或者崩溃能够停留在异常或者崩溃发生的地方那该是多好呀。幸运的是有一个方法可以做到。Xcode有一个漂亮的功能叫做异常断点,允许我们在异常发生的时候在异常发生的地方放一个断点。你可以指定具体的异常也可以指定所有的异常。
怎样开启异常断点呢?工程切换到异常浏览窗口,点击下方左侧的“Add Breakpoint”按钮,然后选择“Add Exception Breakpoint”确保可以捕获所有异常。
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526170910_1.jpg)
现在异常发生时调试器不会直接跳转到主函数了,而是停留在了异常发生的地方。
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526170928_1.jpg)
这个断点给了我们一个调试异常非常好的开始的点,不用我们再去遍历代买去找异常发生的地方了。
2Condational Breakpoints(条件断点)
最后一个调试技巧条件断点,这只是普通的断点,当变量满足一定条件时程序停止。这个调试技巧在当你想要捕获一个循环中的变量的特定值或者一些不常发生的情况时是非常有用的,而不用你每次迭代都停止来查看。
怎样开启条件变量?只不过是添加一个普通断点,然后右键点击断点选择“Edit Breakpoint”,这时就打开了一个断点编辑器,你可以在这里设置断点条件(以及一些其他的断点设置),然后选择“Done”,这个调试技巧非常简单吧。
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526171037_1.jpg)
3 [b]unrecognized selector send to instancd 快速定位[/b]
在Debug菜单中Breakpoints->Create Symbolic Breakpoint
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526171105_1.png)
在Symbolic中填写如下方法签名
-[NSObject(NSObject) doesNotRecognizeSelector:]
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526171141_1.png)
设置完成后再遇到类似的错误就会定位到具体的代码。对于unrecognized selector sent to instance XXX的bug,大部分情况下是因为对象被提前release了,在你并不希望他release的情况下,指针还在,对象已经不在了。
很多时候,是因为init初始化函数中,对属性赋值没有使用self.foo赋值,而是直接对foo赋值,导致属性对象没有retain(心里以为retain了),而提前释放。
4 Static Analyzer(静态分析)
Static Analyzer是一个非常好的工具去发现编译器警告不会提示的问题和一些个人的内错泄露和死存储(不会用到的赋了值的变量)错误。这个方法可能大大的提高内存使用和性能,以及提升应用的整体稳定性和代码质量。
怎么打开Static Analyzer?打开Xcide的“Product”菜单,选择Analyzer选项(或者使用热键? shift B)。正像你看到的下面的截图,Static Analyzer会捕获任何应用内的可能的问题然后以蓝色的警告展示出来。
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526170949_1.jpg)
我们也可以设置我们的应用在我们编译应用的时候自动开启Static Analyzer,打开项目project文件,设置“Run Static Analyzer”为YES,如下图:
当你的应用异常或者崩溃的时候Xcode喜欢做的一件事情是直接跳到主函数,就像第一个调试技巧中用到的那个例子一样。如果异常或者崩溃能够停留在异常或者崩溃发生的地方那该是多好呀。幸运的是有一个方法可以做到。Xcode有一个漂亮的功能叫做异常断点,允许我们在异常发生的时候在异常发生的地方放一个断点。你可以指定具体的异常也可以指定所有的异常。
怎样开启异常断点呢?工程切换到异常浏览窗口,点击下方左侧的“Add Breakpoint”按钮,然后选择“Add Exception Breakpoint”确保可以捕获所有异常。
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526170910_1.jpg)
现在异常发生时调试器不会直接跳转到主函数了,而是停留在了异常发生的地方。
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526170928_1.jpg)
这个断点给了我们一个调试异常非常好的开始的点,不用我们再去遍历代买去找异常发生的地方了。
2Condational Breakpoints(条件断点)
最后一个调试技巧条件断点,这只是普通的断点,当变量满足一定条件时程序停止。这个调试技巧在当你想要捕获一个循环中的变量的特定值或者一些不常发生的情况时是非常有用的,而不用你每次迭代都停止来查看。
怎样开启条件变量?只不过是添加一个普通断点,然后右键点击断点选择“Edit Breakpoint”,这时就打开了一个断点编辑器,你可以在这里设置断点条件(以及一些其他的断点设置),然后选择“Done”,这个调试技巧非常简单吧。
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526171037_1.jpg)
3 [b]unrecognized selector send to instancd 快速定位[/b]
在Debug菜单中Breakpoints->Create Symbolic Breakpoint
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526171105_1.png)
在Symbolic中填写如下方法签名
-[NSObject(NSObject) doesNotRecognizeSelector:]
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526171141_1.png)
设置完成后再遇到类似的错误就会定位到具体的代码。对于unrecognized selector sent to instance XXX的bug,大部分情况下是因为对象被提前release了,在你并不希望他release的情况下,指针还在,对象已经不在了。
很多时候,是因为init初始化函数中,对属性赋值没有使用self.foo赋值,而是直接对foo赋值,导致属性对象没有retain(心里以为retain了),而提前释放。
4 Static Analyzer(静态分析)
Static Analyzer是一个非常好的工具去发现编译器警告不会提示的问题和一些个人的内错泄露和死存储(不会用到的赋了值的变量)错误。这个方法可能大大的提高内存使用和性能,以及提升应用的整体稳定性和代码质量。
怎么打开Static Analyzer?打开Xcide的“Product”菜单,选择Analyzer选项(或者使用热键? shift B)。正像你看到的下面的截图,Static Analyzer会捕获任何应用内的可能的问题然后以蓝色的警告展示出来。
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526170949_1.jpg)
我们也可以设置我们的应用在我们编译应用的时候自动开启Static Analyzer,打开项目project文件,设置“Run Static Analyzer”为YES,如下图:
![](http://www.cocoachina.com/cms/uploads/allimg/140526/4196_140526170956_1.jpg)
相关文章推荐
- 阿里巴巴技术文章分享 Javascript继承机制的实现
- js转换Date日期格式
- 机器学习的三个基本量纲 Three Fundamental Dimensions for Thinking About Machine Learning Systems
- mac jdk环境变量
- JDBC连接数据库
- java中length,length(),size()区别
- adb操作命令详解及大全
- 在VS2010/MFC中如何对对话框添加控件
- 落球问题
- 数据结构之常见的数据结构
- SVN本地服务器的搭建
- C# Excel写入
- code signing is required for product type 'Application' in SDK 'iOS 9.1'
- centos 下更改ftp登录根目录
- android 动态设置background颜色
- 围棋十诀
- MagicalRecord入门教程
- 深度学习与大数据的比较 Deep Learning vs Big Data: Who owns what?
- Android Http请求头与响应头
- 跟我一起学extjs5(11--自己定义模块的设计)