zoukankan      html  css  js  c++  java
  • iOS

    常用的NSLog的语句

    在iOS开发过程中,调试是很重要的过程,而除了各种断点调试(普通断点、条件断点、全局断点)之外,似乎NSLog是我们调试最常用的方法,当然,也是最简单朴素的寻debug方法。

    NSLog(@"打印字符串:%@",name);
    
    NSLog(@"打印整形:%i",number);//或者 %li ; %ld ; %d
    
    NSLog(@"打印字符:%c",c);
    
    NSLog(@"打印单浮点数:%f",f);
    
    NSLog(@"打印精度浮点数:%.2f",f);
    
    NSLog(@"BOOL--b-->%@",isYES?@"YES":@"NO");//打印布尔类型
    

    但这样并不是我们想要的结果,因为打印出来的结果,有时我们并不知道它打印的具体位置,甚至于具体信息。打个比方吧,我们经常会遇到的数组越界、网络请求数据为空等等。

    我们试一下看看:创建一个空数组-->dataArray,却打印数组的第三个元素。打印结果如下图:  image

    从上图中我们可以看出,一个标准的数组越界,但我们看得出来,debug输出只是说又一个数组越界报错了,但并没有指出是哪个数组,数组在哪个位置。。。试想:如果我们在一个ViewController中有几个数组,这时数组出现越界。就会很难找出到底哪个数组出现debug。那么问题就出现了,怎样才能使用NSLog还能确定位置呢。 下面正式开始要说的话题:不一样的NSLog打印

    要使用不一样的NSlog,首先要了解 以下:预处理器在C/C++/objective-C语言提供的宏

    C/C++/Objective-C中用于日志输出的预处理宏.

    Macro Format Specifier Description
    __func__ %s 打印当前函数名
    __LINE__ %d 源码文件中的行号
    __FILE__ %s 源码文件完整路径
    __PRETTY_FUNCTION__ %s __func__类似, 但是在 C++ 代码中包含更多的信息.

    Objective-C中用于日志输出的表达式

    Expression Format Specifier Description
    NSStringFromSelector(_cmd) %@ 当前选择器的名字
    NSStringFromClass([self class]) %@ 当前对象类的名字
    [[NSString stringWithUTF8String:__FILE__] lastPathComponent] %@ 源码文件的名称
    [NSThread callStackSymbols] %@ 当前栈信息的刻度字符串数组。仅用于调试,不用向终端用户展示或者在代码中用作任何逻辑。

       * __func__%s 当前函数签名

       * __LINE__%d 在源代码文件中当前所在行数 ---->宏在预编译时会替换成当前的行号

       * __FILE__ %s 当前源代码文件全路径 -->宏在预编译时会替换成当前的源文件名

       * __PRETTY_FUNCTION__ %s 像 __func__,但是包含了C++代码中的隐形类型信息。 ---->宏在预编译时会替换成当前的函数名称

      而关于Log,打印当前函数无非就是_cmd, __func__, __FUNCTION__, PRETTY_FUNCTION

    1、打印当前的函数名,以及当前代码所在文件中得行数

    //直接定位到debug的函数名,以及当前代码所在文件中得行数。
    NSLog(@"%s, %d", __FUNCTION__, __LINE__);
    

      在- (void)viewDidLoad中输入以下代码。。。

    image

      打印结果如下:

    image

    2、打印当前的函数名, NSStringFromSelector 获得参数的选择器所代表的方法的字符串

     NSLog(@"%@", NSStringFromSelector(_cmd));
    

    打印结果如下:

    image

    3、打印当前源代码文件全路径

    NSLog(@"%s", __FILE__);
    

    打印结果如下:

    image

    4、使用__PRETTY_FUNCTION__

    上面介绍过:像 __func__,但是包含了C++代码中的隐形类型信息。

    NSLog(@"%s", __PRETTY_FUNCTION__);
    

     打印结果:

    image

    在Xcode中 :

       _cmd会返回一个SEL对象,而剩下的都是来自C/C++编译器的定义所以都会返回一个C的字符串,显示结果也都差不多,可能不同编译器会有小小的差别。

         显然后面`__func__`系列要比_cmd好用,相对Objective-C类型内的方法调用,他不仅会显示方法名,还会显示类型,配合`__LINE__`,可以精确定位出Log在代码中的位置。
    

    以下是我学习时查看的文章,也分享给大家。懂得感恩,懂得尊重它们的劳动成果:

    iOS各种调试技巧豪华套餐

    好了,以上就是我想介绍的NSLog有助于开发中定位打印的知识。都是我在接触到喜欢、再到使用的东西。iOS还有很多很多东西是我们不懂的,甚至是毫无所知的。一步一步来,摸索->学习->实践->熟练。每一步都很辛苦,坚持下,往前走会是不一样的风景。

    转自:
    作者:青卷三部
    出处:http://www.cnblogs.com/LQCQ-Silent/
    签名:灾难总是接踵而至,这正是世间的常理。只要找个理由,就会有谁来救你吗?要是死了,就只是说明我不过是如此程度的男人。

    路漫漫其修远兮,吾将上下而求索!!!
  • 相关阅读:
    C#操作REDIS例子
    A C# Framework for Interprocess Synchronization and Communication
    UTF8 GBK UTF8 GB2312 之间的区别和关系
    开源项目选型问题
    Mysql命令大全——入门经典
    RAM, SDRAM ,ROM, NAND FLASH, NOR FLASH 详解(引用)
    zabbix邮件报警通过脚本来发送邮件
    centos启动提示unexpected inconsistency RUN fsck MANUALLY
    rm 或者ls 报Argument list too long
    初遇Citymaker (六)
  • 原文地址:https://www.cnblogs.com/LGLblog/p/12532017.html
Copyright © 2011-2022 走看看