天天看点

iOS之《Effective Objective-C 2.0》读书笔记(17)

第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;
}