无论开发什么程序,也不管编写程序的程序猿的水平多高 ,肯定都会用到调试,肯定会经常打印查看对象的信息;
常用的方式就是使用NSLog,例如:
NSLog(@"obj = %@",obj)
运行后,obj对象会收到description消息,该方法所返回的描述信息将取代“格式化字符串”里的“%@”,如果obj是一个数组的话,请看下面的例子:
//数组 NSArray* obj = @[@1,@2,@3]; NSLog(@"obj = %@",obj); //打印信息如下 obj = ( 1, 2, 3 ) //字典 NSDictionary * anotherDic = @{@"animal":@"dog",@"kid":@"boy",@"food":@"bread"}; NSLog(@"anotherDic = %@",anotherDic); //打印信息如下 anotherDic = { animal = dog; food = bread; kid = boy; }
但是,如果在自定义的类上这么做,输出的信息却是指针地址 like this
PingkTest * object = [[PingkTest alloc] init]; NSLog(@"object = %@",object); //打印信息 //object = <PingkTest: 0x7f9b5b692a30>
和数组或字典输出的信息相比 ,此信息对我们没什么用,除非实现description方法,否则打印信息时就会向上调用,调用NSObject类所实现的默认方法。
接下来,我们看一下具体的实现代码:
// // PingkTest.h // LearnEffective2.0 // // Created by pk on 15/5/19. // Copyright (c) 2015年 iss. All rights reserved. // #import <Foundation/Foundation.h> @interface PingkTest : NSObject @property (nonatomic,copy,readonly)NSString * name; @property (nonatomic,copy,readonly)NSString * likeColorName; - (id)initWithName:(NSString *)name andColorName:(NSString *)colorName; @end
// // PingkTest.m // LearnEffective2.0 // // Created by pk on 15/5/19. // Copyright (c) 2015年 iss. All rights reserved. // #import "PingkTest.h" @implementation PingkTest - (id)initWithName:(NSString *)name andColorName:(NSString *)colorName { if (self = [super init]) { _name = [name copy]; _likeColorName = [colorName copy]; } return self; } @end
此时调用初始化方法并打印:
PingkTest * object = [[PingkTest alloc] initWithName:@"pingk" andColorName:@"black"]; NSLog(@"object = %@",object); //打印信息 //object = <PingkTest: 0x7f9b5b692a30>
接下来实现description方法:
在.m文件中实现如下代码:
-(NSString *)description { return [NSString stringWithFormat:@"<%@: %p,\"%@,%@\">",[self class],self,_name,_likeColorName]; }
再次运行,发现打印的信息神奇的变了,like this
object = <PingkTest: 0x7ff1b8706850,"pingk,black">
这样的话,打印的信息就更加清楚了,对我们开发者来说就更有意义了;
在新实现的description方法中,也应该像默认的那样,打印出类名和指针地址,不过在系统对NSArray和NSDictionary就没有将这两项信息打印进去;
有个简单的方法,可以在description方法中输出互不相同的信息,就是借助NSDictionary的description方法,此方法输出的信息格式如下:
anotherDic = { animal = dog; food = bread; kid = boy; }
修改description方法,将打印的信息变成字典
-(NSString *)description { return [NSString stringWithFormat:@"<%@: %p,%@>",[self class],self,@{ @"name":_name, @"likeColorName":_likeColorName }]; }
打印信息如下:
object = <PingkTest: 0x7f8648f03270,{ likeColorName = black; name = pingk; }>
下面参考一下系统提供得NSArray 的调试信息,看截图
用NSLog 打印出的信息并不包含类名和指针地址,在调试窗口(console内容输出窗口中)用po 命令打印信息,发现又有类名和指针地址 ,
这就说明是两个不同得方法,用po 打印对象的方法就必须实现debugDescription方法。修改一下方法:
-(NSString *)description { return [NSString stringWithFormat:@"%@",@{ @"name":_name, @"likeColorName":_likeColorName }]; } -(NSString *)debugDescription { return [NSString stringWithFormat:@"<%@: %p,%@>", [self class], self, @{ @"name":_name, @"likeColorName":_likeColorName }]; }
此时再插入断点,运行代码至断电处,就能让信息输出与NSArray 一致了,看截图:
这样就方便我们打印查看对象的信息了。
接下来就会引发一个新的问题,如果每个类在定义的时候都需要这样实现,会不会觉得麻烦呢。