美文网首页Swift
swift如何设置Debug模式下的打印输出

swift如何设置Debug模式下的打印输出

作者: 吃面多放葱 | 来源:发表于2017-03-16 10:43 被阅读0次

    在调试程序时,很多开发者喜欢用输出 log 的方式对代码的运行进行追踪,帮助理解。Swift 编译器并不会帮我们将 print 或者 debugPrint 删去,在最终 app 中它们会把内容输出到终端,造成性能的损失。我们当然可以在发布时用查找的方式将所有这些log 输出语句删除或者注释掉,但是更好的方法是通过添加条件编译来将这些语句排除在 Release 版本外。在 Xcode 的 Build Setting 中,在 Other Swift flags 的 Debug 栏中加入 -D DEBUG 即可加入一个编译标识。


    之后我们就可以通过将print 或者 debugPrint包装一下:
         fuc Dlog (item : Any, file : String = #file, lineNum : Int = #line){
            #if DEBUG 
                let fileName = (file as NSString).lastPathComponent 
                print ("fileName:\(fileName)\n lineNum:\(lineNum)\n \(item)")
            #endif
         }
    

    这样,在 Release 版本中,dPrint 将会是一个空方法,所有对这个方法的调用都会被编译器剔除掉。需要注意的是,在这种封装下,如果你传入的 items 是一个表达式而不是直接的变量的话,这个表达式还是会被先执行求值的。如果这对性能也产生了可测的影响的话,我们最好用 @autoclosure 修饰参数来重新包装 print。这可以将求值运行推迟到方法内部,这样在 Release 时这个求值也会被一并去掉:

          func Dlog(@autoclosure item: () -> Any, file : String = #file, lineNum : Int = #line) {
              #if DEBUG
                   let fileName = (file as NSString).lastPathComponent 
                   print ("fileName:\(fileName)\n lineNum:\(lineNum)\n \(item)")
              #endif
          }
    
          Dlog(resultFromHeavyWork())
          // Release 版本中 resultFromHeavyWork() 不会被执行
    

    参考

    Swift 性能探索和优化分析

    相关文章

      网友评论

        本文标题:swift如何设置Debug模式下的打印输出

        本文链接:https://www.haomeiwen.com/subject/ozednttx.html