zoukankan      html  css  js  c++  java
  • iOS debug模式

    今天在看公司代码的时候发现了一段代码

    项目里几乎所有的方法都使用了DLog,但是并没有相关内容被打印出来,所以就很奇怪,后来发线是第一行多写了一个下划线,把下划线去掉就能输出了,可能是输出的log太多他把这个几行代码废掉了,让我郁闷半天,关于这段代码有一个博客已经很好的解释了https://www.jianshu.com/p/00c603669085

    在开发过程中,我们经常需要用到NSLog输出一些信息,甚至有的开发过程,必须在控制台查看输出,有经验的程序员通过控制台输出就能知道整个数据交互的一个流程.但是一个发布的程序,里面带有太多的NSLog输出,肯定对于App性能有所影响,这时候我们可以使用一个宏定义来处理,在开发的时候使用DEBUG模式,在发布的时候使用RELEASE模式.这样,发布的App就不会在程序内部做大量的NSLog输出了.
      简单的代码如下:

    #if defined (DEBUG)||defined(_DEBUG)   
     NSLog(@"测试代码");    
    NSLog(@"Test Coding");
    #endif
    

    上面的#if #endif宏定义的意思就是如果定义了DEBUG,那么就使用NSLog输出;否则这段代码就直接忽略不执行.有人会疑问这个DEBUG和_DEBUG来自哪里,这个其实不用担心,这个来自于Xcode的默认设置,我们可以取消DEBUG模式,开启RELEASE发布模式,如下面的截图所示.
      选择Product->Scheme->Edit Scheme

     

    App发布的时候,这些全部都要改成release模式
    这些都选为release,就意味着默认没有定义Debug,则上面代码中#if...#endif之间的输出NSLog不会执行.这样在发布应用程序的时候,就节省了一些硬件设备的资源.

    如何确定项目是处于Debug模式还是Release模式下?
    首先确定一下项目的Build Settings是否已经设置过宏定义DEBUG,

    如果已经设置过,在Preprocessor Macros的Debug后面会有DEBUG=1,如果没有,就手动设置一下.
    接下来就可以这样做:

    #ifdef DEBUG    
    // do sth
    #else   
    // do sth
    #endif
    

    也可以使用正则NSLog语句:

    #ifndef DEBUG
    #undef NSLog
    #define NSLog(args,...)
    #endif
    

    幸运的是,这里有一个最简单的办法进行log——通过一个宏,让NSLog只在debug build的时候起作用。将这个功能添加到全局都能访问得到的头文件中。这样你就可以尽情的使用log了,并且当进行production时,不会包含log相关代码。如下代码:

    #ifdef DEBUG 
    #defineDMLog(...)
    NSLog(@"%s %@", __PRETTY_FUNCTION__,[NSString stringWithFormat:__VA_ARGS__])
    #else# defineDMLog(...)do{}while(0)
    

    补充:如果上面的写法有点复杂 下面的写法就简单的多

    //release屏蔽NSLog
    //放在.pch文件里
    #ifdef DEBUG
    #else
    #define NSLog(...) {};
    #endif
    

    现在如果使用DMLog,那么将只会在debug build期间打印出log。而production build时则不会有任何log。通过PRETTY_FUNCTION可以打印出打印log所在的函数。

    总结:虽然NSLog非常出色,但它也有一些限制:
    只能在本地打印
    不支持带级别的log(例如严重、警告等)
    NSLog效率低。在进行大量处理时,NSLog会严重影响程序的执行效率
    互联网上也有一些框架可以进行日志记录,通过这些框架可以避免NSLog的一些限制。下面有两个不错的:
    Cocoa LumberJack – 这是针对Cocoa非常出名的一个日志框架。虽然刚开始用的时候会费劲点,但是它非常强大。
    SNLog – NSLog的一个替代品。

  • 相关阅读:
    独立人格,让人生更美好
    版本控制入门简介
    Android蓝牙操作
    Android Rect和RectF的区别
    做个环保主义的程序员
    java/android下JNI编程总结
    别太单纯,也别太不单纯
    C++ namespace的用法
    JNI编程
    企业架构 - 架构原则
  • 原文地址:https://www.cnblogs.com/chebaodaren/p/9018083.html
Copyright © 2011-2022 走看看