一、介绍
description方法是NSObject类的一个实例方法,因此所有的Object-C对象都有description方法。description方法返回的永远是字符串。
description方法的作用是打印对象跟Java里的toString有点类似。对于一个Person类,如果没有重写description方法,NSLog(@“%@”,p),输出的是p的地址,而我们想要的效果是打印出person的成员变量,所以我们可以在Person类里重写description方法。
二、应用
新建一个Person类
声明部分:
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property (nonatomic, copy)NSString * name;
@property (nonatomic, assign)NSInteger age;
-(instancetype)initWithName:(NSString *)name age:(NSInteger)age;
@end
实现部分:
-(instancetype)initWithName:(NSString *)name age:(NSInteger)age{
self = [super init];
if (self) {
self.name = name;
self.age = age;
}
return self;
}
创建一个Person对象并打印该对象
Person * person = [[Person alloc] initWithName:@"大圣" age:500];
NSLog(@"%@",person);
输出的结果为:
2016-06-13 11:17:08.231 Description-test[2795:112637] <Person: 0x7f855a607db0>
//这两个方法是等价的
//NSLog();函数在打印时都会去调用对象的description方法。控制台只能输出字符串。description方法返回的正是字符串。
NSLog(@"%@",person);
NSLog(@"%@",[person description]);
输出结果为:
2016-06-13 11:26:49.772 Description-test[2861:119853] <Person: 0x7f8278c19d90>
2016-06-13 11:26:49.773 Description-test[2861:119853] <Person: 0x7f8278c19d90>
要想打印时获取自己感兴趣的内容需要重写父类的description方法
-(NSString *)description{
NSString * string = [NSString stringWithFormat:@"<Person: name = %@ age = %ld>",self.name,self.age];
return string;
}
此时的输出结果为:
2016-06-13 11:30:58.330 Description-test[2913:122828] <Person: name =大圣 age = 500>
三、重写字典的descriptionWithLocal:(id)local indent:(NSUInteger)level方法
重写description方法是不管用的。
需要给字典添加分类,在分类的.m文件中重写即可。不需要在.h文件中声明
-(NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level{
//初始化可变字符串
NSMutableString *string = [NSMutableString string];
//拼接开头[
[string appendString:@"["];
//拼接字典中所有的键值对
[self enumerateKeysAndObjectsUsingBlock:^(id _Nonnull key, id _Nonnull obj, BOOL * _Nonnull stop) {
[string appendFormat:@"%@:",key];
[string appendFormat:@"%@\\",obj];
}];
//拼接结尾]
[string appendString:@"]"];
return string;
}