Description
关于*- (NSString )description;方法,应该使用的还是比较频繁的。
简单介绍一下:
这个方法在所有NSObject类会有一个默认的实现,具体表现在于每当我们使用
NSLog(@"%@",someObject)来打印某个对象信息的时候(注意占位符一定是%@),后台的log内容就是我们description方法中返回的字符串。
比如:
NSString *exampleString = @"AaBbCcDd";
NSLog(@"%@",exampleString);
后台打印如下:
2016-05-24 17:45:59.198 RunTimePlayGround[89500:9545323] AaBbCcDd
对于NSString、NSArray、NSDictionary等类来说,一般description都能返回我们所需要的字符串(如上文例子),比如NSArray的就是所包含元素的description。对于通常一些不太好描述的类的description或者自定义类的description,那么默认的实现就是返回一个由类名和内存地址组成的字符串,比如:
NSLog(@"%@",self);
后台打印如下:
2016-05-24 17:49:11.951 RunTimePlayGround[89523:9555137] <ViewController: 0x7fa30ac3d080>
综上来看,description方法是用来Debug使用的,用来打印我们需要的信息。
为了使我们能够更加清晰直观的看到打印信息,可以通过重写- (NSString *)description;方法来自定义对象的description。
DebugDescription
该方法其实和- (NSString *)description;是差不多的,只不过使用场景稍有不同。
description主要用于日志输出的时候会调用到。
而debugDescription在使用LLDB调试的时候会起到作用。
所以建议一般当我们需要内存地址等一些详尽信息时,可以写在debugDescription里方便LLDB调试用,而一般日志输出则按需要写。
比如在一个自定义Label中我们这么写:
-(NSString *)description
{
return [NSString stringWithFormat:@"%@:%@",NSStringFromClass([self class]),self.text];
}
- (NSString *)debugDescription
{
return [NSString stringWithFormat:@"%@,%p,%@",NSStringFromClass([self class]),self,self.text];
}
测试代码:
记得可以如图位置打上断点用LLDB调试。
后台打印如下:
2016-05-24 18:06:03.191 RunTimePlayGround[89593:9587129] AaBbCcDd
2016-05-24 18:06:03.192 RunTimePlayGround[89593:9587129] <ViewController: 0x7fa243595a40>
(lldb) po testLabel
TestLabel,0x7fa2434227b0,sssss
(lldb)
总结
其实要点不多,简单来说还是以下两点。
- 1 重写descpription方法来返回一个有意义,直观的字符串可以方便自己做日志调试。
- 2 当description的信息已经不足够时,重写debugDescription来做补充。
- 3 怎么更好使用这两种方法也需要按照场合,自己按需使用。