文档章节

ios define NSLog debug 应用发布nslog注释

孙启超
 孙启超
发布于 2014/01/12 20:29
字数 769
阅读 1001
收藏 3

1 选择工程的Target -> Build Settings -> Preprocessor Macros.

如图,默认 Debug项,是“DEBUG=1”.

2 在程序中设置全局宏定义

在程序的 ApplicationName-Prefix.pch 文件中,加入如下,很简单

#ifdef DEBUG_MODE
#define DLog( s, ... ) NSLog( @"<%p %@:(%d)> %@", self, [[NSString stringWithUTF8String:__FILE__] lastPathComponent], __LINE__, [NSString stringWithFormat:(s), ##__VA_ARGS__] )
#else
#define DLog( s, ... ) 
#endif


3 这样就设置好了,测试

在任意ViewController.m中写入 

DLog(@"1234");

结果:

2012-07-25 17:09:54.448 xxxx[7094:707] <0x28f790 ViewController.m:(64)> 1234

这样发布的时候DLog就不会有输出了。 


在Objective-c开发程序的时候,有专门的日志操作类NSLog,它将指定的输出,输出到(stderr),我们可以利用Xcode的日志输出窗口,那么既然是要记录到具体日志文件,我们就想输出日志写入到具体的日志文件即可。
 
代码
1、  宏定义(下面是我在程序中常用到的日志宏,用DEBUG开关管理,
也就是说只有在DEBUG模式下才让日志输出 :)
 
#ifdef DEBUG 
#  define LOG(fmt, ...) do {                                            \ 
        NSString* file = [[NSString alloc] initWithFormat:@"%s", __FILE__]; \ 
        NSLog((@"%@(%d) " fmt), [file lastPathComponent], __LINE__, ##__VA_ARGS__); \ 
        [file release];                                                 \ 
    } while(0) 
#  define LOG_METHOD NSLog(@"%s", __func__) 
#  define LOG_CMETHOD NSLog(@"%@/%@", NSStringFromClass([self class]), NSStringFromSelector(_cmd)) 
#  define COUNT(p) NSLog(@"%s(%d): count = %d\n", __func__, __LINE__, [p retainCount]); 
#  define LOG_TRACE(x) do {printf x; putchar('\n'); fflush(stdout);} while (0) 
#else 
#  define LOG(...) 
#  define LOG_METHOD 
#  define LOG_CMETHOD 
#  define COUNT(p) 
#  define LOG_TRACE(x) 
#endif
 
可以看到,除了标准的用户定义输出外,我还加入了许多有用的信息,
比如源程序文件位置,行号,类名,函数名等。具体的应用可以在具体的开发过程中添加、删除。
 
2、  应用:
- (void)redirectNSLogToDocumentFolder{ 
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory,NSUserDomainMask, YES); 
    NSString *documentsDirectory = [paths objectAtIndex:0]; 
    NSString *fileName =[NSString stringWithFormat:@"%@.log",[NSDate date]]; 
    NSString *logFilePath = [documentsDirectory stringByAppendingPathComponent:fileName]; 
    freopen([logFilePath cStringUsingEncoding:NSASCIIStringEncoding],"a+",stderr); 

 
- (void)applicationDidFinishLaunching:(UIApplication *)application { 
    // 真机测试时保存日志 
    if ([CDeviceInfo getModelType] != SIMULATOR) { 
        [self redirectNSLogToDocumentFolder]; 

}
 
真机测试的时候,可以利用freopen将标准错误输出保存到指定的文件当中,
这样就可以在问题发生后分析日志文件。
 
3、  设置DEBUG标志是否正确定义
 
Xcode 一般会在 debug 运行配置项里面已经定义号了DEBUG 标志,如果没定义我们就自己写上,以我的 Xcode 4 为例,在项目get Info中找到 PreProcessor Macros 这个属性,对于 Debug 配置我们给他写上 DEBUG,而在 Release 配置中把它留空。 这样我们刚才那段预处理命令就可以根据这个标志来判断我们编译的时调试版本还是发布版本,从而控制 NSLog 的输出。 (因为 Xcode 4 会把 debug/release 两个配置项同时对比展现出来,而 3.x 版本的只能分别设置,如果你用的时xcode 3.x 开发工具, 那么就分别对 Debug/Release 都检查一下)。


© 著作权归作者所有

孙启超
粉丝 122
博文 172
码字总数 276126
作品 0
浦东
高级程序员
私信 提问
加载中

评论(1)

叶秀兰
叶秀兰
代码显示有问题,重新编辑一下吧:)
NSLog使用,在release版本禁止输出NSLog内容

在程序开发中,我们需要经常需要实时输出一些运行数据来判断程序是否正确的运行,在IOS开发中,NSLog很像printf和println,会在控制台里面格式化的输出结果。使用NSLog输出,对应不同的对象需...

长平狐
2012/11/01
326
0
iOS深入学习:华丽的#define

我建了一个iOS开发QQ交流群:188647173,大家可以一起来相互学习。 还有一个群里面大神的个人站点www.mylonly.com,大家有不会的可以向他请教。 本片博客参考CocoaChina上面的文章,对内容进...

召唤攻城狮
2014/04/18
0
0
iOS深入学习:#define

ios#define 我建了一个iOS开发QQ交流群:714042473,大家可以一起来相互学习。 一般情况下,我们使用#define来定义一个常量,#define的本质是文本替换,例如#define INTPTR int*,这时候我们...

iOS洛柒
2018/07/12
0
0
开源中国iOS客户端学习——(一)Prefix.pch文件

当我们新建一个工程的时候,在Supporting FIles文件下会看到一个以 -Prefix.pch结尾文件的文件,pch全称是“precompiled header”,也就是预编译头文件,该文件里存放的工程中一些不常被修改...

青云_K
2013/01/10
0
0
iOS开发,#define的使用(系列一)

1、判断当前设备是不是iOS7以上版本 #define IOSVERSION7ORABOVE (([[[UIDevice currentDevice] systemVersion] floatValue] >= 7.0)? (YES):(NO)) 如果判断系统的设备在项目中使用频繁,那么...

召唤攻城狮
2014/04/10
0
0

没有更多内容

加载失败,请刷新页面

加载更多

Class 文件结构

https://www.cnblogs.com/honghuzidelaoren/p/3622021.html

Java搬砖工程师
11分钟前
2
0
未分类资料

$ Inside the Linux Kernel 与知乎出产 一张漫画看懂Linux系统结构

十万猛虎下画山
12分钟前
1
0
Android人脸识别Demo竖屏YUV方向调整和图片保存

本博客包含三个常用方法,用于盛开Android版人脸识别Demo中竖屏使用时送入yuv数据,但一直无法识别的情况。 1.首先可以尝试顺时针旋转90°或270°,然后送入识别SDK。 2.旋转方向后依然无法识...

是哇兴哥棒棒哒
16分钟前
1
0
选择阿里云数据库HBase版十大理由

根据Gartner的预计,全球非关系型数据库(NoSQL)在2020~2022预计保持在30%左右高速增长,远高于数据库整体市场。 阿里云数据库HBase版也是踏着技术发展的节奏,伴随着NoSQL和大数据技术的兴...

阿里云云栖社区
28分钟前
1
0
平滑与滤波

五种常见的平滑滤波器: (1)方框型滤波器: 顾名思义,方框型滤波器就是用一个方框型的kernel跟二维图像进行卷积,其核定义如下: kernel= 其中, a = 1 当该滤波器非归一化滤波器 (1) a=...

yepanl
34分钟前
2
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部