iOS 高效开发-----实现description 方法

无论开发什么程序,也不管编写程序的程序猿的水平多高 ,肯定都会用到调试,肯定会经常打印查看对象的信息;

常用的方式就是使用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 一致了,看截图:

技术分享

这样就方便我们打印查看对象的信息了。

接下来就会引发一个新的问题,如果每个类在定义的时候都需要这样实现,会不会觉得麻烦呢。

 

  

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。