添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • Xcode中运行代码程序查看。
  • Xcode ->Window ->Devices 中查看手机中运行的进程的输出日志。
  • 使用Mac自带的控制台应用程序查看日志,在LaunchPad中搜索 Console 应用。
  • 几种常用的打印方式

    Objective-C

    1.记得以前写OC的时候,总是定义一个打印宏。(记得以前看过一篇博客,将宏的,就拿这个输出打印举例子,写的很好)

    //打印输出(定位)
    #define NSLog(FORMAT, ...) fprintf(stderr,"%s:%d  \t%s\n",[[[NSString stringWithUTF8String:__FILE__] lastPathComponent] UTF8String], __LINE__, [[NSString stringWithFormat:FORMAT, ##__VA_ARGS__] UTF8String]);

    Swift

  • println
  • println是swift2中删除的print变体(末尾加换行符)。可以直接使用print替换。

  • print
  • print在Swift2之前,没有在打印的末尾添加换行符,这也就是println存在的意义,现在print末尾默认添加了换行符。

    print有几个参数:separator连接符,terminator末尾符,toStream决定文本信息被发送到哪里。

    print还有个非常重要的性质:在调试应用程序的时候在Xcode控制台中输出信息,简单的说就是:上面三种查看打印的方式,print只在第一中可以看到打印信息,第二种和第三种方式,是看不到打印信息的。

     print(<#T##items: Any...##Any#>, separator: <#T##String#>, terminator: "", to: &<#T##TextOutputStream#>)

    3. NSLog

  • NSLog比较慢。
  • 使用NSLog的好处是前面有时间戳也会有标识符添加到输出。
  • NSLog语句会出现在设备的控制台和调试器的控制台中,而print只出现在调试器控制台中。即上面说的打印方式都会看到打印。
  • 使用打印有一点需要了解一下:使用 print()/println()输出的话,它会简单地使用 流(stream) 的概念,把需要输出的每个字符一个一个的输出到控制台。普通使用并没有问题,可是当多线程同步输出的时候问题就来了,如果很多 print()/println() 同时打印,就会导致控制台上的字符混乱的堆在一起,而NSLog() 就没有这个问题。
  • 4. os_log

  • os_log即 统一日志记录 系统的一部分。(iOS 10/macOS 10.12)
  • 使用os_log前先导入:
  • 	import os.log
  • 同NSLog一样,os_log将输出消息到Xcode调试控制台和设备控制台。
  • 关于os_log的具体使用, 请参考
  • 为了不进行一些无谓的print,最好使用宏自定义打印方法 Swift中设置宏定义(swift中没有宏的概念): build Settings -> Other Swift Flags ->Debug添加宏定义(-D DEBUG)

    public func YXPrint(_ message:Any?, columnNumber: Int = #column, fileName: String = #file, methodName: String = #function, lineNumber:Int = #line) {
        #if DEBUGSWIFT
            let title = "文件名:\(fileName)\n方法:\(methodName)\n行号:\(lineNumber)\n当前北京时间:" + YX_Time.default.myNewTime
            print(title)
            if message == nil  {
                print("")
                return
            print(message!)
        #endif
    

    Swift添加宏

  • 在项目的Build Settings里配置Swift Compiler - Custom Flags,展开Other Swift Flags,在Debug右侧输入“-DDEBUG”。也可以“-D DEBUG”,但是不能有赋值,如:“-DDEBUG=1” 或 “-D DEBUG=1”都是无效的。
  • 在项目的Build Settings里配置Apple LLVM x.x - Preprocessiong,展开Preprocessor Macros,在Debug右侧默认包含“DEBUG=1”,若没有请手动加入。
  • 说明:第1步使Swift代码编译Debug时定义DEBUG标记,第2步使Objective-C、C、C++的LLVM预处理在Debug时定义DEBUG=1宏标记。如果是纯Swift工程可以忽略第2步。

  • 在Swfit有另外一种方法是通过函数判断编译的优化选项,但是不够直观而且没有官方的文档,不建议使用。
  • // ** Be carefull, Don`t do this: **
    if _isDebugAssertConfiguration() {
        print("--通过函数判断编译的优化选项--")
    

    Swift中的编译标记

    #if <condition>
    #elseif <condition>
    #else
    #endif

    其中#elseif 和 #else 是可选的。