今天在研究代碼的時候沼填,發(fā)現(xiàn)一個很有趣的函數(shù)袖裕,- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level 便研究了一下分瘾。
個人博客: https://linit.space
問題
比如我們有如下代碼塊
TestObj *object = [[TestObj alloc] init];
object.name1 = @"vname1";
object.name2 = @"vname2";
object.name3 = @"vname3";
object.name4 = @"vname4";
NSLog(@"%@",@[@"1",@"2",@{@"keyxx":@"value",@"key2":@"value2",@"key3":@{@"1":@"xxxx",@"dic":@{@"你好啊1":@"林某某猪贪!",@"你好啊2":@"林某某!",@"你好啊3":@"林某某!",@"你好啊4":@"林某某伯铣!",@"你好啊5":@"林某某!",@"你好啊6":@"林某某轮纫!",@"你好啊7":@"林某某腔寡!"},@"axaasx":@"3"},@"key4":@"value4"},@"3",object]);
打印的結(jié)果是
(
1,
2,
{
key2 = value2;
key3 = {
1 = xxxx;
axaasx = 3;
dic = {
"\U4f60\U597d\U554a1" = "\U6797\U67d0\U67d0\Uff01";
"\U4f60\U597d\U554a2" = "\U6797\U67d0\U67d0\Uff01";
"\U4f60\U597d\U554a3" = "\U6797\U67d0\U67d0\Uff01";
"\U4f60\U597d\U554a4" = "\U6797\U67d0\U67d0\Uff01";
"\U4f60\U597d\U554a5" = "\U6797\U67d0\U67d0\Uff01";
"\U4f60\U597d\U554a6" = "\U6797\U67d0\U67d0\Uff01";
"\U4f60\U597d\U554a7" = "\U6797\U67d0\U67d0\Uff01";
};
};
key4 = value4;
keyxx = value;
},
3,
"<TestObj: 0x7fb7fbc71520>"
)
中文直接用unicode編碼打印出,自定義類的內(nèi)容也不明確掌唾,導(dǎo)致查看的非常的不方便放前。
解決方案
實現(xiàn)description開頭方法,為了更加使得打印結(jié)果更有格式糯彬,所以實現(xiàn)- (NSString )descriptionWithLocale:(id)locale indent:(NSUInteger)level凭语。
==*注:優(yōu)先級 - (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level > - (NSString *)description ,所以,例如NSDictionary撩扒,NSArray等似扔,已經(jīng)實現(xiàn)了- (NSString )descriptionWithLocale:(id)locale indent:(NSUInteger)level此方法,所以如果實現(xiàn)- (NSString )description則沒有效果搓谆。==
原理
在使用NSObject類替換%@占位符時炒辉,會調(diào)用description相關(guān)方法,所以只要實現(xiàn)此方法挽拔,就可以起到修改打印內(nèi)容的作用辆脸。因此對于系統(tǒng)的類但校,才用增加分類的方式實現(xiàn)螃诅,而自己的類,就是增加方法。
代碼實現(xiàn)
#import <objc/runtime.h>
@interface TestObj : NSObject
@property (nonatomic, copy)NSString *name1;
@property (nonatomic, copy)NSString *name2;
@property (nonatomic, copy)NSString *name3;
@property (nonatomic, copy)NSString *name4;
@end
@implementation TestObj
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level
{
NSMutableString *mStr = [NSMutableString string];
NSMutableString *tab = [NSMutableString stringWithString:@""];
for (int i = 0; i < level; i++) {
[tab appendString:@"\t"];
}
[mStr appendFormat:@"<%@ = {\n",NSStringFromClass(self.class)];
unsigned int outCount;
objc_property_t *properties = class_copyPropertyList([self class], &outCount);
for (int i = 0; i < outCount; i++)
{
objc_property_t property = properties[i];
const char *charProperty = property_getName(property);
NSString *propertyName = [NSString stringWithUTF8String:charProperty];
if (propertyName) {
id propertyValue = [self valueForKey:propertyName];
NSString *lastSymbol = (outCount == i + 1) ? @"":@";";
if ([propertyValue respondsToSelector:@selector(descriptionWithLocale:indent:)]) {
[mStr appendFormat:@"\t%@%@ = %@%@\n",tab,propertyName,[propertyValue descriptionWithLocale:locale indent:level + 1],lastSymbol];
} else {
[mStr appendFormat:@"\t%@%@ = %@%@\n",tab,propertyName,propertyValue,lastSymbol];
}
}
}
free(properties);
[mStr appendFormat:@"%@}>",tab];
return mStr;
}
@end
@implementation NSDictionary (myTest)
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level
{
NSMutableString *mStr = [NSMutableString string];
NSMutableString *tab = [NSMutableString stringWithString:@""];
for (int i = 0; i < level; i++) {
[tab appendString:@"\t"];
}
[mStr appendString:@"{\n"];
NSArray *allKey = self.allKeys;
for (int i = 0; i < allKey.count; i++) {
id value = self[allKey[i]];
NSString *lastSymbol = (allKey.count == i + 1) ? @"":@";";
if ([value respondsToSelector:@selector(descriptionWithLocale:indent:)]) {
[mStr appendFormat:@"\t%@%@ = %@%@\n",tab,allKey[i],[value descriptionWithLocale:locale indent:level + 1],lastSymbol];
} else {
[mStr appendFormat:@"\t%@%@ = %@%@\n",tab,allKey[i],value,lastSymbol];
}
}
[mStr appendFormat:@"%@}",tab];
return mStr;
}
@end
@implementation NSArray (myTest)
- (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level
{
NSMutableString *mStr = [NSMutableString string];
NSMutableString *tab = [NSMutableString stringWithString:@""];
for (int i = 0; i < level; i++) {
[tab appendString:@"\t"];
}
[mStr appendString:@"(\n"];
for (int i = 0; i < self.count; i++) {
NSString *lastSymbol = (self.count == i + 1) ? @"":@",";
id value = self[i];
if ([value respondsToSelector:@selector(descriptionWithLocale:indent:)]) {
[mStr appendFormat:@"\t%@%@%@\n",tab,[value descriptionWithLocale:locale indent:level + 1],lastSymbol];
} else {
[mStr appendFormat:@"\t%@%@%@\n",tab,value,lastSymbol];
}
}
[mStr appendFormat:@"%@)",tab];
return mStr;
}
@end
結(jié)果
(
1,
2,
{
keyxx = value;
key3 = {
1 = xxxx;
dic = {
你好啊2 = 林某某术裸!;
你好啊6 = 林某某倘是!;
你好啊3 = 林某某!;
你好啊7 = 林某某袭艺!;
你好啊4 = 林某某搀崭!;
你好啊1 = 林某某!;
你好啊5 = 林某某猾编!
};
axaasx = 3
};
key4 = value4;
key2 = value2
},
3,
<TestObj = {
name1 = vname1;
name2 = vname2;
name3 = vname3;
name4 = vname4
}>
)