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

先来看看普通的NSLog:

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

输出的结果为:

-- ::24.270 DictionaryTest[:] {
Person = {
age = ;
name = "\U5f20\U4e09";
};
}

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

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

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

输出结果为:

{
Person = {
age = ;
name = "\U5f20\U4e09";
};
}

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

#define NSLog(FORMAT, ...) fprintf(stderr, "\n\n******(class)%s(begin)******\n(SEL)%s\n(line)%zd\n(data)%s\n******(class)%s(end)******\n\n", [[[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)
(data){
Person = {
age = ;
name = "\U5f20\U4e09";
};
}
******(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)
(data){
"Person" : {
"age" : ,
"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)
(data){"Person":{"age":,"name":"张三"}}
******(class)ViewController.m(end)******

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

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

方法一:

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

#ifdef DEBUG

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

#else

#define NSLog(FORMAT, ...) nil

#endif

这样就完美了。

iOS项目之NSLog相关的更多相关文章

  1. [转载]IOS项目打包除去NSLog和NSAssert处理之阿堂教程

    原文链接地址:http://blog.sina.com.cn/s/blog_81136c2d0102v1ck.html 原文地址:IOS项目打包除去NSLog和NSAssert处理之阿堂教程作者:时空 ...

  2. 开源 iOS 项目分类索引大全 - 待整理

    开源 iOS 项目分类索引大全 GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Cate ...

  3. IOS 项目问题总结

    把自己项目中遇到的问题总结一下,供大家参考,希望大家多多提出意见!! 在Xcode 6.2中遇到Your build settings specify a provisioning profile w ...

  4. 开源 iOS 项目分类索引大全

    GitHub 上大概600个开源 iOS 项目的分类和介绍,对于你挑选和使用开源项目应该有帮助 系统基础库 Category/Util sstoolkit 一套Category类型的库,附带很多自定义 ...

  5. iOS如何限制使用SDK的版本? 解决iOS项目的版本兼容问题

      更新 2015-11-16 感谢微博好友@zyyy_000的评论,补充了为什么要在+ (void)load方法里面做Method Swizzling. 前言 最近,在做项目时,因为某种原因,突然要 ...

  6. ios项目里扒出来的json文件

    p.p1 { margin: 0.0px 0.0px 0.0px 0.0px; font: 13.0px Menlo; color: #000000 } p.p2 { margin: 0.0px 0. ...

  7. iOS项目中常用的第三方开源库

    1.项目使用的第三方开源库 项目使用了CocoaPods(类似java中的maven)管理常用的第三方库,一些特殊的单独引用,下面介绍下比较好用的几个. (1)AFNetworking 目前比较推荐的 ...

  8. ios学习总结(1) -- 创建第一个ios项目

    原文地址 下载并打开xcode. 接着新建一个工程,如下图所示: 点击Create a new Xcode project,之后选择ios下的Application,点击Single View App ...

  9. iOS项目的目录结构和开发流程

    转自无网不剩的博客 网上相关的资源不多,开源的且质量还不错的iOS项目也是少之又少,最近正好跟同事合作了一个iOS项目,来说说自己的一些想法.   目录结构 AppDelegate Models Ma ...

随机推荐

  1. CentOS 7下安装samba

    Samba是一种软件,它可以运行在非Windows平台上,比如UNIX, Linux, IBM System 390, OpenVMS或其他操作系统.Samba使用安装在主机上的TCP/IP协议.当正 ...

  2. Writing custom protocol for nanomsg

    http://vitiy.info/writing-custom-protocol-for-nanomsg/ nanomsg is next version of ZeroMQ lib, provid ...

  3. 深入理解 Java 虚拟机之学习笔记(3)

    垃圾回收(Garbage Collection,GC ),GC的历史其实比Java久远,1960年诞生与MIT的Lisp是第一门真正使用内存动态分配和垃圾收集技术的语言.当Lisp还在胚胎时期时,人们 ...

  4. 给新手学习Java的建议

    有很多的朋友都在问我一个同样的问题:新手应该如何能学好Java.我做了一个简单的总结,分享给大家: 1-信念:无论你是选择JAVA,C,C#,C++....还是其他的语言编程,信念是第一位,只有相信自 ...

  5. java项目(学习和研究)

    java项目就是研究,不断的对项目进行迭代,把产品做的越来越好,就是research. 自己想着做一个java项目把,可以类似牛客网,想好自己的预期产品,在设计的过程中可以不断改进和扩展,在做这个项目 ...

  6. F - Rescue 优先队列bfs

    来源poj Angel was caught by the MOLIGPY! He was put in prison by Moligpy. The prison is described as a ...

  7. poj 2069

    唔. 这道题的火候比较巧妙. 我们是每次找到一个最远的点,然后向那个最远点逼近. 这显然非常合理. #include <cstdlib> #include <cmath> #i ...

  8. poj 1228

    就是给你一堆点,看这些点能否构成一个 稳定的凸包. 凸包每条边上有3个及以上的点就可以了. #include <cstdio> #include <cstring> #incl ...

  9. JBPM工作流(三)——ProcessEngine与Service API

    1.获取processEngine的方法: a) 方法一 private ProcessEngine processEngine = new Configuration().setResource(& ...

  10. vue文件中引入外部js

    1.在项目的入口文件中(app.js)定义remoteScript标签 Vue.component('remote-script', { render: function (createElement ...