今天在各种搞自定义宏,替换NSLog。修改宏的次数特别多。大家都知道修改任意一个宏,项目就要重新编译。原来项目编译一次只要5秒钟,只要你修改一个宏,编译一次就要25秒钟,5倍,很吓人。大家还是慎用宏。可以参考我原来的文章OC中extern、static、const和宏定义
写这篇文章的时候需要频繁Edit scheme 这里告诉你们快接键command + shift + , 不用快捷键打开太慢了,你调试完自定义log就可以忘了这个快捷键了。
下面就是对应的方法了。找一个类定义两个方法
/*
获取当前事件,自定义log使用, yyyy-MM-dd HH:mm:ss
*/
NSString* currentTime(){
NSDateFormatter *formatter = [[NSDateFormatter alloc] init];
[formatter setDateFormat:@"yyyy-MM-dd HH:mm:ss"];
NSString *currentTime = [formatter stringFromDate:[NSDate date]];
return currentTime;
}
/*
获取当前项目名称,自定义log使用,
*/
NSString* projectName(){
NSDictionary *infoDictionary = [[NSBundle mainBundle] infoDictionary];
NSString *projectName = [infoDictionary objectForKey:(NSString *)kCFBundleExecutableKey];
return projectName;
}
然后在pch文件中定义宏
#ifndef __OPTIMIZE__ //DEBUG 模式
//#ifdef DEBUG //DEBUG 模式
#define VCLog(...) printf("%s %s %s\n",[currentTime() UTF8String],[projectName() UTF8String],[[NSString stringWithFormat:__VA_ARGS__]UTF8String]);
#else
#define VCLog(...) //Release 不输出log,节省资源
#endif
一定要调用UTF8String
方法,否则会乱码。
这里对__OPTIMIZE__
做一下解释,这个宏是Release模式下系统定义的宏,所以可以根据这个来判断当前是不是release模式。
这里教大家一个装逼的方法来定义宏,但是没什么卵用,仅仅是用来装逼
这里的下划线是拼接的作用,可以实现一样的效果。
tips
这里解决下#ifdef DEBUG
不起作用的情况
按照如图所示的步骤检查一下,你这个位置是不是设置了DEBUG这个宏。这里的宏你是可以随意添加的。
我的项目刚开始就是因为这里没有添加DEBUG导致
#ifdef DEBUG
不起作用,然后不得已用#ifndef __OPTIMIZE__
进行了替换,现在可以放心的使用#ifdef DEBUG
了。