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 一致了,看截图:

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

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

      

  • 相关阅读:
    智器SmartQ T7实体店试用体验
    BI笔记之SSAS库Process的几种方案
    PowerTip of the Day from powershell.com上周汇总(八)
    PowerTip of the Day2010071420100716 summary
    PowerTip of the Day from powershell.com上周汇总(十)
    PowerTip of the Day from powershell.com上周汇总(六)
    重新整理Cellset转Datatable
    自动加密web.config配置节批处理
    与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
    在VS2003中以ClassLibrary工程的方式管理Web工程.
  • 原文地址:https://www.cnblogs.com/tianlin106/p/4514689.html
Copyright © 2011-2022 走看看