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

先来看看普通的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. E - Stones 优先队列

    来源1896 Because of the wrong status of the bicycle, Sempr begin to walk east to west every morning an ...

  2. js 函数中的this

    资料 function 函数 没有"this"的持久概念, 调用函数时,创建this function hello(thing) { console.log(this + &quo ...

  3. 利用mimikatz破解远程终端凭据,获取服务器密码

    测试环境:windows 10 道友们应该碰到过管理在本地保存远程终端的凭据,凭据里躺着诱人的胴体(服务器密码),早已让我们的XX饥渴难耐了.但是,胴体却裹了一身道袍(加密),待老衲操起法器将其宽衣解 ...

  4. liunx系统问题总结

    1.Unable to locate package错误      解决办法 :输入命令 sudo apt-get update,进行软件的更新

  5. https://stackoverflow.com/questions/10423781/sql-data-range-min-max-category

    select phone,count(order_id) as c from table_recordgroup by phoneorder by c desc SELECT CASEWHEN (ag ...

  6. daemon函数详解

    https://blog.csdn.net/xinyuan510214/article/details/50903280

  7. vue:不同环境配置不同打包命令

    修改prod.env.js 'use strict'const target = process.env.npm_lifecycle_event;if (target == 'build') { // ...

  8. ADC裸机程序

    硬件平台:JZ2440 实现功能:通过采集触摸屏ADC的电压值,推算触摸xy坐标 start.s init.c nand.c interrupt.c uart.c uart.h my_stdio.c ...

  9. 16.4-uC/OS-III同步 (任务信号量)

    信号量和消息队列均是单独的内核对象,是独立于任务存在的. 任务信号量 仅发布给一个特定任务 .任务消息队列 可以发布给多个任务. 任务信号量伴随任务存在,只要创建了任务,其任务信号量就是该任务的一个数 ...

  10. Android studio中导入SlidingMenu问题

    我们导入的library文件夹中的build.gradle 文件里面写的很清楚: android {     compileSdkVersion 17     buildToolsVersion &q ...