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:18];
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;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值