一、iOS开发如何调试程序
1、根据模拟器控制台报错信息找出问题所在
错误代码:
#import "ViewController.h"
@interface ViewController ()
@property (nonatomic, strong)NSMutableArray *arr;
@end
@implementation ViewController
- (NSArray *)arr {
if (_arr == nil) {
_arr = [NSMutableArray arrayWithCapacity:10];
}
return _arr;
}
- (void)viewDidLoad {
[super viewDidLoad];
[self runDemo];
}
- (void)runDemo {
NSLog(@"%@", self.arr[1]);
}
在模拟器上的报错信息如下:
注意:若在真机上调试程序报错,则只是显示错误信息,而不显示程序详细的调用堆栈的内容。
2、查看视图的层次结构,如视图遮挡以及自动布局的错误等
3、设置断点
断点调试主要是用于查看执行到该断点时所有变量的值,具有如下几个功能:
单步调试:每次只执行一行代码,如果调用了方法,程序不会跟踪方法的执行代码
步入调试:在进行单步调试时,如果需要跟踪某个方法执行的细节,可以使用步入调试查看方法执行的细节。
步出调试:当通过步入调试跟踪某个方法时,可以通过步出调试结束该方法,返回到该方法的调用环境
4、lldb
5、instrument:Time Profile / Core Animation / 内存泄漏
5.1、静态内存分析
内存分析:主要是检测在MRC环境下有没有内存泄漏(创建的对象,使用完毕没有被释放)的问题。在ARC环境下,循环引用、CoreFoundation框架等
概念:不运行程序,直接对代码语法进行检测,分析是否有内存泄露 ,不仅仅是只检测内存,而是检测代码逻辑
优点:分析速度快,可以快速对所有的代码进行内存分析,查找出来对应的内存泄露
缺点:不一定准确,但是基本准确。根据语法上下文来分析你的程序到底有没有内存泄漏
注意:如果提示有内存泄露,一定要根据上下的语法分析代码是否有问题。
5.2、动态内存分析
概念:真正运行起来程序,并且借助instrument(性能调试工具)工具来分析代码是否有某些地方产生了内存泄露
优点:分析非常准确,并且只要分析出来有内存泄露,基本可以断定代码一定有问题
缺点:需 一处一处来分析,并不能对全局的代码进行分析.
注意:动态内存分析时最好使用真机,因为模拟器和电脑配置有关;在release模式下测试,因为代码会进行精简。
注意:在真实开发中,应该是静态内存分析和动态内存分析结合的方式来分析内存。特别是ARC环境下 的CoreFoundation框架的东西,使用静态内存分析先分析,之后使用动态内存分析再来分析一次。
二、程序上架后如何收集一些错误信息
1、通过腾讯的bugly调试: https://bugly.qq.com/v2/
除了bugly还有许多第三方框架做错误收集处理,如友盟。
作为一个ios程序员每天都要看崩溃日志
三、处理程序中经常使用NSLog调试输出的技巧
1、创建一个pch文件
2、定义NSLog的宏
//保证ifdef中的宏定义只会在oc的代码中被引用
#ifdef __OBJC__
//方法一:让宏定义的NSLog在调试的时候可以使用,在发布时不会被使用
#ifdef DEBUG
//#define NSLog(...) NSLog(__VA_ARGS__)
#define NSLog(fmt, ...) NSLog((@"%s [Line %d]" fmt), __PRETTY_FUNCTION__, __LINE__, ##__VA_ARGS__)
#else
#define NSLog(...)
#endif
//方法二 避免NSLog的缺陷,因为有时候打印数据时会有缺失
#if DEBUG
#define NSLogs(FORMAT, ...) NSLogs(stderr, "%s:%zd\t%s\n", [[[NSString stringWithUTF8String: __FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat: FORMAT, ## __VA_ARGS__] UTF8String]); /**<输出语句*/
#else
#define NSLogs(fmt, ...)
#endif
#ifndef PrefixHeader_pch
#define PrefixHeader_pch
/* pch作用:
1.存放公用宏 2.存放公用头文件 3.自定义Log、
*/
#endif /* PrefixHeader_pch */
3、修改项目是否处于调试还是发布的状态即可看到效果