NSLog打印优化

1 NSLog

在开发过程中,我们会使用NSLog打印一些日志,如果在NSArray或NSDictionary中有中文字符时,如下。

NSArray *array = [NSArray arrayWithObjects:@"阳君", nil];
NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:array, @"name", @"937447974", @"qq", nil];
array = [NSArray arrayWithObjects:@"阳君", dict, nil];
dict = [NSDictionary dictionaryWithObjectsAndKeys:array, @"name", @"937447974", @"qq", nil];
NSLog(@"%@", dict);

打印出来会显示Unicode码。

如图这样很不利于开发过程的调试。如果你说这样很好,你看的懂,那你牛逼!

2 NSLog打印优化

通过分析打印的实质是调用了NSArray或NSDictionary对象的- (NSString *)descriptionWithLocale:(id)locale方法。我们只需重写这个方法即可。

这里使用了类NSLog+Extension。+号可以告诉大家,这是一个扩展类。

NSLog+Extension.h代码如下

//
//  NSLog+Extension.h
//  NSLog
//
//  CSDN:http://blog.csdn.net/y550918116j
//  GitHub:https://github.com/937447974/Blog
//
//  Created by yangjun on 15/11/17.
//  Copyright © 2015年 阳君. All rights reserved.
//

#import <Foundation/Foundation.h>

/** 数组NSLog打印扩展*/
@interface NSArray (NSLogExtension)

@end

/** 字典NSLog打印扩展*/
@interface NSDictionary (NSLogExtension)

@end

/** NSSet打印扩展*/
@interface NSSet (NSLogExtension)

@end

NSLog+Extension.m代码如下

//
//  NSLog+Extension.m
//  NSLog
//
//  CSDN:http://blog.csdn.net/y550918116j
//  GitHub:https://github.com/937447974/Blog
//
//  Created by yangjun on 15/11/17.
//  Copyright © 2015年 阳君. All rights reserved.
//

#import "NSLog+Extension.h"

#if 1

#pragma mark -  NSLog打印辅助方法
id logExtension(id obj) {
    id tempObj = obj;
    // 遇到NSArray、NSSet或NSDictionary的子类,内容后移\t
    if ([obj isKindOfClass:[NSDictionary class]] || [obj isKindOfClass:[NSArray class]] || [obj isKindOfClass:[NSSet class]]) {
        NSString *str = [NSString stringWithFormat:@"%@", obj];
        str = [str stringByReplacingOccurrencesOfString:@"\n" withString:@"\n\t"];
        tempObj = str;
    } else if ([obj isKindOfClass:[NSString class]]) { // NSString类型数据加双引号
        tempObj = [NSString stringWithFormat:@"\"%@\"", obj];
    }
    return tempObj;
}


#pragma mark - 数组NSLog打印扩展
@implementation NSArray (NSLogExtension)

#pragma mark 数组打印
- (NSString *)descriptionWithLocale:(id)locale {
    NSMutableString *str = [NSMutableString stringWithString:@"(\n"];
    // 遍历数组的所有元素
    for (id obj in self) {
        [str appendFormat:@"\t%@,\n", logExtension(obj)];
    }
    [str appendString:@")"];
    return str;
}

@end


#pragma mark - 字典NSLog打印扩展
@implementation NSDictionary (NSLogExtension)

#pragma mark 字典打印
- (NSString *)descriptionWithLocale:(id)locale {
    __block NSMutableString *str = [NSMutableString stringWithString:@"{\n"];
    // 遍历字典的所有键值对
    [self enumerateKeysAndObjectsUsingBlock:^(id  _Nonnull key, id  _Nonnull obj, BOOL * _Nonnull stop) {
        [str appendFormat:@"\t%@ = %@,\n", key, logExtension(obj)];
    }];
    [str appendString:@"}"];
    // 删掉最后一个,
    NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch];
    // 保护机制找到才删除
    if (range.location > 0 && range.location < str.length) {
        [str deleteCharactersInRange:range];
    }
    return str;
}

@end


#pragma mark - NSSet NSLog打印扩展
@implementation NSSet (NSLogExtension)

#pragma mark NSSet打印
- (NSString *)descriptionWithLocale:(id)locale {
    NSMutableString *str = [NSMutableString stringWithString:@"{(\n"];
    for (id value in self) {
        NSLog(@"%@", value);
        [str appendFormat:@"\t%@,\n", logExtension(value)];
    }
    [str appendString:@")}"];
    // 删掉最后一个,
    NSRange range = [str rangeOfString:@"," options:NSBackwardsSearch];
    // 保护机制找到才删除
    if (range.location > 0 && range.location < str.length) {
        [str deleteCharactersInRange:range];
    }
    return str;
}

@end

#endif

我们使用字符串拼接的方式返回要打印的字符串。这里使用了函数logExtension,主要是因为在数组中包含字典或数组时,要让显示数据后移’\t’。

3 测试

只需引入文件,无须在类中引入头文件。再次运行前面的测试代码,打印输出

可以发现两个的打印结果格式没有太大差异,但是优化后的打印看着就是爽。

4 小结

本博文讲解了工作中的常用的NSLog打印优化,其实还有一种就是将数据转换为NSString再查看。但是没有格式,数据庞大时,不利于查看,如果你有兴趣可以查看的的博文《JSON解析》。

 


其他

源代码

https://github.com/937447974/Objective-C

文档修改记录

时间描述
2015-11-16NSLog打印优化
2015-11-19修改源代码,字典遍历不使用并发,防止线程错误
2015-12-29增加NSSet打印扩展,增加对NSString的支持

版权所有

CSDN:http://blog.csdn.net/y550918116j

GitHub:https://github.com/937447974/Blog

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值