PCH:
- pch全称是“precompiled header”,也就是预编译头文件,该文件里存放的工程中一些不常被修改的代码,比如常用的框架头文件,这样做的目的提高编译器编译速度。我们知道当我们修改一个工程中某个文件代码时候,编译器并不是重新编译所有所有文件,而是编译改动过文件的,假如pch中某个文件修改了,那么pch整个文件里包含的的其他文件也会重新编译一次,这样就会消耗大量时间,所以它里面添加的文件最好是是很少变动或不变动的头文件或者是预编译的代码片段。
- 新建PCH头文件
-
设置工程头文件路径:
注意这里Prefix Header 用
$(SRCROOT)
表示根目录。
xcode的两种DEBUG和REALEASE模式。
DEBUG和REALEASE区别
Realease是发行版本,比Debug版本有一些优化,文件比Debug文件小 Debug是调试版本,Debug和Release调用两个不同的底层库。通俗点讲,我们开发者自己内部真机或模拟器调试时,使用Debug模式就好,等到想要发布时,也就是说需要大众客户使用时,需要build Release版本。
DEBUG模式简介
- "Debug是调试版本,包括的程序信息更多"
- 只有DEBUG版的程序才能设置断点、单步执行、使用TRACE/ASSERT等调试输出语句。
- REALEASE不包含任何调试信息,所以体积小、运行速度快。
REALEASE模式简介:
//RELEASE DEBUG模式都没有报错
for (int j = 0 ; j<12 ; j++ ) {
int startIndex = emojiRangeArray[j];
int endIndex = emojiRangeArray[j+1]; //【1】、这里j最大是11,所以j+1是12,越界了
NSLog(@"showEmojiView---startIndex: %d, endIndex: %d ",startIndex,endIndex);
printf("showEmojiView---startIndex: %d, endIndex: %d ",startIndex,endIndex);
printf("\n");
for (int i = startIndex ; i<= endIndex ; i++ ) { //【2】、这里由于上面越界,这里提供的数值不对,所以内部NSArray objectAtIndex调用时候越界了
// Do any additional setup after loading the view, typically from a nib.
}
}
printf("shuc");
//综上这里是基本数据类型直接从栈读取数据,所以不会经过堆,没有所谓的内存检测啊 ,
//RELEASE模式没有报错,DEBUG模式报错 这个是对象 要用栈上的指针找堆内存,找不多,或者找的时候堆内存分配有固定系统结构,结构不对就报错,异常
NSArray *strArray = @[@"1",@"2",@"3"];
// NSLog(@"%@",strArray[3]);
在开发过程中,我们经常需要用到NSLog输出一些信息,甚至有的开发过程,必须在控制台查看输出,有经验的程序员通过控制台输出就能知道整个数据交互的一个流程。但是一个发布的程序,里面带有太多的NSLog输出,肯定对于App性能有所影响,这时候我们可以使用一个宏定义来处理,在开发的时候使用DEBUG模式,在发布的时候使用RELEASE模式。这样,发布的App就不会在程序内部做大量的NSLog输出了。
写在PCH头文件中,代码如下:
#ifdef DEBUG
#define AVLog(...) NSLog(__VA_ARGS__)
#define debugMethod() NSLog(@"%s", __func__)
#else
#define AVLog(...)
#define debugMethod()
#endif
//上段代码的意思就是 用宏指令做一个判断,如果DEBUG为真,则编译#ifdef到#endif宏定义,否则编译器就不编译;
#ifdef DEBUG
# define DBLog(format,...) NSLog((@"[%s][%s][%d]" format), __FILE__, __FUNCTION__, __LINE__, ##__VA_ARGS__);
#else
# define DBLog(...);
#endif
备注:
1.ANSI C标准中有几个标准预定义宏(也是常用的):
__LINE__:在源代码中插入当前源代码行号;
__FILE__:在源文件中插入当前源文件名;
__DATE__:在源文件中插入当前的编译日期
__TIME__:在源文件中插入当前编译时间;
__STDC__:当要求程序严格遵循ANSI C标准时该标识被赋值为1;
__cplusplus:当编写C++程序时该标识符被定义。
2.可变参数宏 ...和_ _VA_ARGS_ _
__VA_ARGS__ 是一个可变参数的宏,很少人知道这个宏,这个可变参数的宏是新的C99规范中新增的,目前似乎只有gcc支持(VC6.0的编译器不支持)。
实现思想就是宏定义中参数列表的最后一个参数为省略号(也就是三个点)。这样预定义宏_ _VA_ARGS_ _就可以被用在替换部分中,替换省略号所代表的字符串。
设置x-code的RELEASE编码模式。(调试程序时不需要这一步,这一步是上线打包改变编码用的)
设置模拟器的release模式
运行检测RELEASE模式下是否有打印日志
Xcode控制台插件 该插件可以将控制台和代码连接,做到点击控制台跳转到相应的代码位置。效果如下图:
补充,程序运行时,command+k可以clear控制台日志。