第17条:实现description方法
1.什么是description和debugDescription?
- NSObject协议中的声明的两个方法,同时NSObject类也实现了这个方法,如果子类没有重写,则会调用父类的方法,主要用于调试程序 – 参考
- 在NSObject类中,使用%@替换占位符时,会调用description相关方法,一般用于打印
- description是我们在程序中打Log会调用的方法
- debugDescription则是我们在断点调试时,在控制台使用po命令打印会调用的方法
2.具体使用时都会重写,那如何重写description?
- 不重写description时的打印:
Person * person = [[Person alloc] initWithName:@"美女" age:];
NSLog(@"%@",person); // 输出:<Person: 0x7f855a607db0>
- 重写description时的打印:
-(NSString *)description{
NSString * string = [NSString stringWithFormat:@"<Person: name = %@ age = %ld>",self.name,self.age];
return string;
}
NSLog(@"%@",person); // 输出:<Person: name =美女 age = 18>
3.为什么重写NSDictionary,NSArray等的description没有用?
(1)优先级A>B,而NSDictionary,NSArray等已经实现了方法A,故重写description没有用
// 方法A
- (NSString )descriptionWithLocale:(id)locale indent:(NSUInteger)level
// 方法B
- (NSString )description;
(2)即当调整NSDictionary/NSArray的打印输出时,需要重写方法A
- NSArray
- (NSString *)descriptionWithLocale:(id)locale
{
NSMutableString *strM = [NSMutableString stringWithString:@"(\n"];
[self enumerateObjectsUsingBlock:^(id obj, NSUInteger idx,BOOL *stop) {
[strM appendFormat:@"\t%@,\n", obj];
}];
[strM appendString:@")"];
return strM;
}
- NSDictionary
- (NSString *)descriptionWithLocale:(id)locale
{
NSMutableString *strM = [NSMutableString stringWithString:@"{\n"];
[self enumerateKeysAndObjectsUsingBlock:^(id key,id obj, BOOL *stop) {
[strM appendFormat:@"\t%@ = %@;\n", key, obj];
}];
[strM appendString:@"}\n"];
return strM;
}