一、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]);
}


在模拟器上的报错信息如下:

ios调试模式检测 ios 调试_博客

注意:若在真机上调试程序报错,则只是显示错误信息,而不显示程序详细的调用堆栈的内容。

2、查看视图的层次结构,如视图遮挡以及自动布局的错误等


3、设置断点

断点调试主要是用于查看执行到该断点时所有变量的值,具有如下几个功能:

ios调试模式检测 ios 调试_博客_02

单步调试:每次只执行一行代码,如果调用了方法,程序不会跟踪方法的执行代码

步入调试:在进行单步调试时,如果需要跟踪某个方法执行的细节,可以使用步入调试查看方法执行的细节。

步出调试:当通过步入调试跟踪某个方法时,可以通过步出调试结束该方法,返回到该方法的调用环境


4、lldb


5、instrument:Time Profile / Core Animation  /  内存泄漏

5.1、静态内存分析

内存分析:主要是检测在MRC环境下有没有内存泄漏(创建的对象,使用完毕没有被释放)的问题。在ARC环境下,循环引用、CoreFoundation框架等

概念:不运行程序,直接对代码语法进行检测,分析是否有内存泄露 ,不仅仅是只检测内存,而是检测代码逻辑

优点:分析速度快,可以快速对所有的代码进行内存分析,查找出来对应的内存泄露

缺点:不一定准确,但是基本准确。根据语法上下文来分析你的程序到底有没有内存泄漏

注意:如果提示有内存泄露,一定要根据上下的语法分析代码是否有问题。

ios调试模式检测 ios 调试_#define_03


5.2、动态内存分析
概念:真正运行起来程序,并且借助instrument(性能调试工具)工具来分析代码是否有某些地方产生了内存泄露 

优点:分析非常准确,并且只要分析出来有内存泄露,基本可以断定代码一定有问题

缺点:需 一处一处来分析,并不能对全局的代码进行分析.

注意:动态内存分析时最好使用真机,因为模拟器和电脑配置有关;在release模式下测试,因为代码会进行精简。

注意:在真实开发中,应该是静态内存分析和动态内存分析结合的方式来分析内存。特别是ARC环境下 的CoreFoundation框架的东西,使用静态内存分析先分析,之后使用动态内存分析再来分析一次。

ios调试模式检测 ios 调试_#define_04

ios调试模式检测 ios 调试_ios调试模式检测_05

ios调试模式检测 ios 调试_#define_06

ios调试模式检测 ios 调试_调试_07

ios调试模式检测 ios 调试_调试_08

ios调试模式检测 ios 调试_调试_09



二、程序上架后如何收集一些错误信息

1、通过腾讯的bugly调试: https://bugly.qq.com/v2/

除了bugly还有许多第三方框架做错误收集处理,如友盟。

作为一个ios程序员每天都要看崩溃日志


三、处理程序中经常使用NSLog调试输出的技巧

1、创建一个pch文件

ios调试模式检测 ios 调试_内存泄露_10

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、修改项目是否处于调试还是发布的状态即可看到效果

ios调试模式检测 ios 调试_ios调试模式检测_11