以前使用NSLog打印中文就是重写下面的方法.
- (NSString *)descriptionWithLocale:(nullable id)locale;
然而在某个版本(我也记不清楚是什么版本了).这个方法失效了.NSLog不会走这个方法.当时简单的查阅了一下资料就改了…今天看了看一个特别老旧的项目没有输出中文.想到之前改的这个事情了.纯属记录一下吧.
在新版本中使用
- (NSString *)descriptionWithLocale:(nullable id)locale indent:(NSUInteger)level;
来代替之前的方法.
注:下面贴出具体代码
@implementation NSArray (Log)
/// old
- (NSString *)descriptionWithLocale:(id)locale {
NSMutableString *strM = [NSMutableString string];
[strM appendString:@"(\n"];
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
// 判断是否是最后一个元素
if (idx == self.count - 1) {
[strM appendFormat:@"\t%@\n", obj];
} else {
[strM appendFormat:@"\t%@,\n", obj];
}
}];
[strM appendString:@")\n"];
return strM;
}
/// new
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
NSMutableString *strM = [NSMutableString string];
[strM appendString:@"(\n"];
[self enumerateObjectsUsingBlock:^(id _Nonnull obj, NSUInteger idx, BOOL * _Nonnull stop) {
// 判断是否是最后一个元素
if (idx == self.count - 1) {
[strM appendFormat:@"\t%@\n", obj];
} else {
[strM appendFormat:@"\t%@,\n", obj];
}
}];
[strM appendString:@")\n"];
return strM;
}
@end
@implementation NSDictionary (Log)
/// old
- (NSString *)descriptionWithLocale:(id)locale {
NSMutableString *strM = [NSMutableString string];
[strM appendString:@"{\n"];
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[strM appendFormat:@"\t%@ = %@;\n", key, obj];
}];
[strM appendString:@"}\n"];
return strM;
}
/// new
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
NSMutableString *strM = [NSMutableString string];
[strM appendString:@"{\n"];
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[strM appendFormat:@"\t%@ = %@;\n", key, obj];
}];
[strM appendString:@"}\n"];
return strM;
}
@end
拓展:打印格式的控制
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level {
NSMutableString *strM = [NSMutableString string];
[strM appendString:@"{\n"];
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[strM appendFormat:@"\t%@ = %@;\n", key, obj];
}];
[strM appendString:@"}\n"];
NSInteger levelNum = 0;
NSUInteger lenth = strM.length;
for (NSUInteger i = lenth - 1; i > 0; i--) {
NSString *strCompare = [strM substringWithRange:NSMakeRange(i, 1)];
if ([strCompare isEqualToString:@"}"] || [strCompare isEqualToString:@")"]) {
for (NSInteger j = 0; j < levelNum - 1; j++) {
[strM insertString:@" " atIndex:i];
}
levelNum++;
} else if ([strCompare isEqualToString:@"{"] || [strCompare isEqualToString:@"("]) {
levelNum--;
} else if ([strCompare isEqualToString:@"\n"]) {
for (NSInteger j = 0; j < levelNum + 1; j++) {
[strM insertString:@" " atIndex:i+1];
}
}
}
return strM;
}
主要是在下面的方法里头进行了打印格式的控制.因为一般打印的回调都是一个Dictionary.所以我偷懒了一下就在NSDictionary的分类里头写了.大家看懂了就行
NSInteger levelNum = 0;
NSUInteger lenth = strM.length;
for (NSUInteger i = lenth - 1; i > 0; i--) {
NSString *strCompare = [strM substringWithRange:NSMakeRange(i, 1)];
if ([strCompare isEqualToString:@"}"] || [strCompare isEqualToString:@")"]) {
for (NSInteger j = 0; j < levelNum - 1; j++) {
[strM insertString:@" " atIndex:i];
}
levelNum++;
} else if ([strCompare isEqualToString:@"{"] || [strCompare isEqualToString:@"("]) {
levelNum--;
} else if ([strCompare isEqualToString:@"\n"]) {
for (NSInteger j = 0; j < levelNum + 1; j++) {
[strM insertString:@" " atIndex:i+1];
}
}
}
注:序列化操作大量json数据的时候(对应到我们App就是我写的购票模块)时间消耗比较大,可以正常操作(release版本屏蔽NSLog)