zoukankan      html  css  js  c++  java
  • iOS项目之NSLog相关

            这算是在项目中最常用的命令了,方便程序员查看日志数据,便于程序调试。在开发中我们经常会进行一些设置,下面就来简单的说一说:

            先来看看普通的NSLog:

    - (void)viewDidLoad {
        [super viewDidLoad];
        // 准备的数据
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"TestNSLogData" ofType:@"plist"];
        NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
        
        NSLog(@"%@", dict);
    }

            输出的结果为:

    2017-03-09 16:27:24.270 DictionaryTest[11495:322828] {
        Person =     {
            age = 20;
            name = "U5f20U4e09";
        };
    }

            于是发现了一些令人不愉快的问题,下面就一个一个来解决吧。

            首先解决日期输出。有些时候我们需要一个干净的日志输出,可NSLog里自带了一些东西,于是就得想办法取消那些麻烦的输出,只取我们需要的东西,所以在这里我们就使用了C语言了输出方法了(printf / fprintf):

    printf("%s", [[NSString stringWithFormat:@"%@", dict] UTF8String]);

            输出结果为:

    {
        Person =     {
            age = 20;
            name = "U5f20U4e09";
        };
    }

            现在输出的结果就非常干净了,而且还可以自己自定义,让它满足自己的风格,然后封装成宏定义,自己看着舒服就OK。下面是我的宏定义:

    #define NSLog(FORMAT, ...) fprintf(stderr, "
    
    ******(class)%s(begin)******
    (SEL)%s
    (line)%zd
    (data)%s
    ******(class)%s(end)******
    
    ", [[[NSString stringWithUTF8String: __FILE__] lastPathComponent] UTF8String], __FUNCTION__, __LINE__, [[NSString stringWithFormat: FORMAT, ## __VA_ARGS__] UTF8String], [[[NSString stringWithUTF8String: __FILE__] lastPathComponent] UTF8String]);

            输出结果为:在这里显示了类名,方法名,命令所在行数,数据

    ******(class)ViewController.m(begin)******
    (SEL)-[ViewController viewDidLoad]
    (line)35
    (data){
        Person =     {
            age = 20;
            name = "U5f20U4e09";
        };
    }
    ******(class)ViewController.m(end)******

            然后再解决中文显示的问题。在日志输出中,中文输出总显示unicode编码格式,不便于程序员阅读。于是添加了两行代码:

    - (void)viewDidLoad {
        [super viewDidLoad];
        
        // 准备的数据
        NSString *filePath = [[NSBundle mainBundle] pathForResource:@"TestNSLogData" ofType:@"plist"];
        NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
        
        // 数据格式转换
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:dict options:NSJSONWritingPrettyPrinted error:nil];
        NSString *jsonStr = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
        
        NSLog(@"%@", jsonStr);
    }

            输出的结果为:

    ******(class)ViewController.m(begin)******
    (SEL)-[ViewController viewDidLoad]
    (line)38
    (data){
      "Person" : {
        "age" : 20,
        "name" : "张三"
      }
    }
    ******(class)ViewController.m(end)******

            这样就能正确显示中文了。但考虑到以后经常会使用到这两行代码,于是写了一个NSObject的分类,将这个代码封装成一个方法,便于以后的使用。

    // .h 文件
    
    #import <Foundation/Foundation.h>
    
    @interface NSObject (Extension)
    
    - (NSString *)sjx_jsonString;
    
    @end
    
    /*----------  华丽的分隔线  ----------*/
    
    // .m 文件
    
    #import "NSObject+Extension.h"
    
    @implementation NSObject (Extension)
    
    - (NSString *)sjx_jsonString
    {
        if (!self) return nil;
        // 数据格式转换
        NSData *jsonData = [NSJSONSerialization dataWithJSONObject:self options:NSJSONWritingPrettyPrinted error:nil];
        return [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    }
    
    @end

            这样输出时就这样写:

    NSLog(@"%@", [dict sjx_jsonString]);

            结果和上面一样。

            如果项目中使用到了MJExtension框架,这个分类其实也可以不必添加的,输出的时候这样写:

    NSLog(@"%@", [dict mj_JSONString]);

            输出的结果为:

    ******(class)ViewController.m(begin)******
    (SEL)-[ViewController viewDidLoad]
    (line)38
    (data){"Person":{"age":20,"name":"张三"}}
    ******(class)ViewController.m(end)******

            只不过数据结构就不是那么好看,不过现在网上JSON在线编辑器也蛮多的,转换一下就OK了。

            最后考虑到性能问题。在项目上线发布的时候,项目里是不需要NSLog输出的,所以需要设置一下DEBUG 和 RELEASE。

    方法一:

    方法二:使用项目中 xxxxxx.pch文件中添加宏定义,这也是项目中流行的做法:

    #ifdef DEBUG
    
    #define NSLog(FORMAT, ...) fprintf(stderr, "
    
    ******(class)%s(begin)******
    (SEL)%s
    (line)%zd
    (data)%s
    ******(class)%s(end)******
    
    ", [[[NSString stringWithUTF8String: __FILE__] lastPathComponent] UTF8String], __FUNCTION__, __LINE__, [[NSString stringWithFormat: FORMAT, ## __VA_ARGS__] UTF8String], [[[NSString stringWithUTF8String: __FILE__] lastPathComponent] UTF8String]);
    
    #else
    
    #define NSLog(FORMAT, ...) nil
    
    #endif

            这样就完美了。

  • 相关阅读:
    ConfigurationManager读取dll的配置文件
    计算机常用英语词汇
    Com与.Net互操作
    C#创建COM组件供VB,PB,Delphi调用
    程序员的自我修养
    .NET Remoting三种信道Http,Tcp,IPC和Web Service的访问速度比较(转)
    .NET Remoting与Socket、Webservice和WCF的比较及优势 (转)
    .NET Remoting 入门实例
    关于Assembly.LoadFrom和Assembly.LoadFile的区别
    大数据处理中必不可少的概念
  • 原文地址:https://www.cnblogs.com/sjxjjx/p/6526626.html
Copyright © 2011-2022 走看看