Xcode 自定义log

来源:互联网 发布:进口牛奶推荐 知乎 编辑:程序博客网 时间:2024/06/05 01:53

今天看到一个很好的自定义log,这里记录一下。

#ifdef DEBUG#define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d\t  %s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);#else#define NSLog(FORMAT, ...) nil#endif

详细解释一下,备忘。
DEBUG模式下,打印日志,RELEASE模式下,不打印日志。
fprintf是一个打印的函数
stderr = Standard error stream 标准错误
如果出现了错误,需要在屏幕上输出错误日志。

%s -> [[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String] 

第一个参数 打印的是这个log所在的文件

%d -> __LINE__

第二个参数 打印的是行号

%s -> [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String])

第三个参数 打印的是具体的输出内容

示例:

NSLog(@"开始");打印的日志:FYPlayManager.m:547   开始

这个自定义log很有用,比如可以在看别人的代码时,控制台可能会有一些日志输出,用这个日志输出可以马上定位到代码位置,快速理解代码。

其他补充:
fprintf 、 printf 、sprintf 的区别:
printf就是标准输出,在屏幕上打印出一段字符串来。
sprintf就是把格式化的数据写入到某个字符串中。返回值字符串的长度。
fprintf是用于文件操作。
例如:int fprintf(FILE *stream,char *format,[argument]);
fprintf()函数根据指定的format(格式)发送信息(参数)到由stream(流)指定的文件.因此fprintf()可以使得信息输出到指定的文件。

stderr 、 stdin 、stdout的区别
当一个用户进程被创建出来时,系统会自动为这个进程创建3个数据流,就是stdin、stdout、stderr。
一个程序要运行,需要有输入、输出,如果出错,还要能表现出自身的错误。这是就要从某个地方读入数据、将数据输出到某个地方,这就够成了数据流。
一个进程初期所拥有的这么三个数据流,就分别是标准输出、标准输入和标准错误,分别用stdout, stdin, stderr来表示。。这3个文件分别为标准输入(stdin)、标准输出(stdout)、标准错误(stderr)。
大多数环境中,stdin指向键盘,stdout、stderr指向显示器。
之所以使用stderr,若因某种原因造成其中一个文件无法访问,相应的诊断信息要在该链接的输出的末尾才能打印出来。当输出到屏幕时,这种处理方法尚可接受,但如果输出到一个文件或通过管道输出到另一个程序时,就无法接受了。若有stderr存在,即使对标准输出进行了重定向,写到stderr中的输出通常也会显示在屏幕上。
标准输出和标准错误默认都是将信息输出到终端上,那么他们有什么区别呢?让我们来看个题目:
问题:下面程序的输出是什么?(intel笔试2011)
int main(){
fprintf(stdout,”Hello “);
fprintf(stderr,”World!”);
return0;
}

解答:这段代码的输出是什么呢?,然后发现输出是:
World!Hello
在默认情况下,stdout是行缓冲的,他的输出会放在一个buffer里面,只有到换行的时候,才会输出到屏幕。而stderr是无缓冲的,会直接输出,举例来说就是fprintf(stdout, “xxxx”) 和 fprintf(stdout,”xxxx\n”),前者会缓存,直到遇到新行才会一起输出。而fprintf(stderr, “xxxxx”),不管有没有\n,都输出。
stderr与stdout的区别
stdout(标准输出),输出方式是行缓冲。输出的字符会先存放在缓冲区,等按下回车键时才进行实际的I/O操作。
stderr(标准出错),是不带缓冲的,这使得出错信息可以直接尽快地显示出来。

关于缓冲的说明:
满缓冲 –> I/O操作只有在缓冲区被填满之后才会进行
有三种情况:1.缓冲区满 2.刷出数据 (fflush)3.关闭文件 (fclose)

行缓冲 –> 通常只有遇到换行符时,才会执行实际的I/O操作;但缓冲区满也会强制执行
行缓冲的情况:1.遇到换行符 2.缓冲区满 3.刷出数据 (fflush) 4.关闭文件 (fclose)

无缓冲 –> 不缓存,直接进行I/O操作 –> 直接输出

先写到这里,想到再补充。

0 0
原创粉丝点击