调试程序时经常需要打印并查看对象信息,最常用做法就是如下
NSLog(@"object = %@",object);
在构建需要打印到日志的字符串时,object对象会收到description消息,该方法所返回的描述信息将取代“格式字符串”里的“%@”。比如,object是个数组,若用下列代码打印其信息:
NSArray *object = @[@"A string", @(123)];
NSLog(@"object = %@",object);
则会输出:
object = (
"A string",
123
)
然而,如果是自定义类,那么输出信息是下面这样:
object = <EOCLocation: 0x60000003aa00>
此时输出内容并不太有用,想要输出有用的信息只需重写description方法并将描述此对象的字符串返回即可,如下有代表个人信息的类:
#import <Foundation/Foundation.h>
@interface EOCPerson : NSObject
@property (nonatomic,copy,readonly) NSString *firstName;
@property (nonatomic,copy,readonly) NSString *lastName;
- (id)initWithFirstName:(NSString *)firstName
lastName:(NSString *)lastName;
@end
#import "EOCPerson.h"
@implementation EOCPerson
- (id)initWithFirstName:(NSString *)firstName lastName:(NSString *)lastName{
if (self = [super init]) {
_firstName = [firstName copy];
_lastName = [lastName copy];
}
return self;
}
@end
该类的description方法可以这样实现:
- (NSString *)description{
return [NSString stringWithFormat:@"<%@: %p, \"%@ %@\">",[self class],self,_firstName,_lastName];
}
该对象将会输出如下的格式:
EOCPerson *person = [[EOCPerson alloc] initWithFirstName:@"Bob" lastName:@"Smith"];
NSLog(@"%@",person);
// output
<EOCPerson: 0x60000002ef80, "Bob Smith">
这样就比覆写之前输出的信息更加清楚,也更有用了。
有个简单的方法,可以在description中输出很多互不相同的信息,就是使用NSDictionary类的description方法。在自定义的description方法中,把待打印的信息放到字典里面,然后将字典对象的description方法所输出的内容包含在字符串里并返回,
如下所示:(详细过程见demo)
- (NSString *)description{
return [NSString stringWithFormat:@"<%@: %p, %@>",[self class],
self,
@{@"title":_title,
@"latitude":@(_latitude),
@"longitude":@(_longitude)}
];
}
输出信息为:
<EOCLocation: 0x60000002efe0, {
latitude = "51.506";
longitude = 0;
title = London;
}>
在断点调试的时候,也可以覆写debugDescription方法,
po person 打印当前类的信息,具体详见demo
本文demo
https://git.oschina.net/iOSlwg/descriptionMethd/tree/master