zoukankan      html  css  js  c++  java
  • 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 一致了,看截图:

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

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

      

  • 相关阅读:
    Java实现寻找最小的k个数
    Java实现寻找最小的k个数
    foruok安晓辉的《程序员,你好哇》,都很不错
    DataSnap的如果网络断线,如何恢复?
    配置QSslConfiguration让客户端程序跳过本地SSL验证
    Linux升级OpenSSL版本
    FMX+Win32,窗口无法保持原样,应该是个bug
    [Nhibernate]二级缓存
    EventBus(事件总线)
    elasticsearch集群搭建实例
  • 原文地址:https://www.cnblogs.com/tianlin106/p/4514689.html
Copyright © 2011-2022 走看看