无论开发什么程序,也不管编写程序的程序猿的水平多高 ,肯定都会用到调试,肯定会经常打印查看对象的信息;
常用的方式就是使用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 一致了,看截图:
这样就方便我们打印查看对象的信息了。
接下来就会引发一个新的问题,如果每个类在定义的时候都需要这样实现,会不会觉得麻烦呢。