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

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

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

  

时间: 2024-07-29 14:25:32

iOS 高效开发-----实现description 方法的相关文章

iOS 高效开发-----实现description 方法 (续)

在 “iOS 高效开发-----实现description 方法”这篇文章的最后,我留下了一个问题,就是,如果要给每个自定义的类覆写description方法和debugDescription方法 ,那将是一件非常庞大的工作量 ,因为自定义的类很多 ,而且每个自定义的类中的属性都会随着需求的修改出现变化 ,那么就又得修改这两个方法,那就变得无穷无尽了,永无宁日了,要么不用,要么就要找到更好得方法去用. 接下来,我们会用到动态运行时runtime. 我们先假设我们要处理的类中的属性都是OC的对象,

iOS 高效开发-----延时执行用GCD

早期我们使用延时执行的方法都是用NSObject 类提供的,performSelector:系列的方法,具体有哪些我们看一下 我们一般让某个对象延时执行某个方法都会调用包含  afterDelay这个参数的方法,此参数即代表延时多长时间执行 ,但是这一系列的方法的参数都只接受继承自NSObject类得对象,也就是说如果我们要向其中传入基本的数据类型,那就必须涉及到数据类型转换,这显然会增加开销,而且这一系列的方法最多也就能传如一个参数,如果我们要传多个参数怎么办呢 ,如果想继续使用这个方法,那我

ios 高效开发-----字面量

Objective-C(一下简称OC) 的语法比较繁杂,但是从OC 1.0 版本起,有一种非常简便的方式能创建NSString 对象,那就是字面量,也就是本篇文章的核心内容.其语法如下: 字面字符串 NSString * string = @"i'm a string"; 如果不用这种方法的话,就要用常见得alloc及init 方法 字面数值 OC提供的用于处理数值(整数.浮点数.bool值)的类是NSNumber,该类提供的主要类方法如下 如果不是用字面量,创建方式如下: NSNum

iOS企业级开发初级课程-表视图(13集)

首先了解了表视图的组成.表视图类的构成.表视图的分类以及表视图的两个重要协议(委托协议和数据源协议),对表视图有了一个整体上的认识.接下来我们掌握了如何实现简单表视图和分节表视图,以及表视图中索引.搜索栏.分组的使用.然后我们学习了如何对表视图单元格进行删除.插入.移动等操作.最后本章向大家介绍了表视图UI设计模式方面的内容. 序号 技术点 1 表视图-1-表视图介绍 2 表视图-2-简单表视图 3 表视图-3-简单表视图下 4 表视图-4-自定义单元格 5 表视图-5-搜索栏-1 6 表视图-

iOS开发——实用篇&amp;提高iOS开发效率的方法和工具

提高iOS开发效率的方法和工具 介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时在使用AppCode等其他的IDE,在这里我主要介绍Xcode中提升开发效率的方法. 1.善用快捷键 快捷键是开发中必不可少的,当你善于使用快捷键的时候,十指在键盘上飞舞,那画面太美,我不敢想象. 常用快捷键操作 2.常用代码片段 开发中有一些常用的代码,可以放到代码片段中,然后下次你就可以使用快捷

《高效团队开发工具与方法》

一直以来都在用所谓的敏捷开发,但是也只是简单的说,用什么用什么,从开始感觉不方便,到后来感觉习惯了,可没有考虑过到底能带来什么改变,所以最近在上下班的地铁上在看完了<高效团队开发工具与方法>,感觉有很大收获. 这本书从团队开讲,讲了团队开发中遇到的一些共性问题,接着对版本管理系统(VCS).缺陷管理系统(ITS/BTS).持续集成(CI).持续交付(CD).回归测试以及GitHub做了易懂的讲解. 版本管理系统:什么时候,谁,做了什么,所以是可追溯,可退回,就像一台摄影机,随时可对不满意的地方

iOS开发 UITableView的方法和属性总结

本文描述UITableView的各种方法,属性,委托以及数据源.本文的目的只是总结UITableView的用法,详细的例子另撰文描述. 1 数据源  UITableViewDataSource协议 01 返回组(节)的个数,默认是返回1,如果只有1组数据,可以不用实现该方法. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView 02 返回某一组的行数,该组由section的值决定 - (NSInteger)table

&lt;转&gt;提高iOS开发效率的方法和工具

介绍 这篇文章主要是介绍一下我在iOS开发中使用到的一些可以提升开发效率的方法和工具. IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时在使用AppCode等其他的IDE,在这里我主要介绍Xcode中提升开发效率的方法. 1.善用快捷键 快捷键是开发中必不可少的,当你善于使用快捷键的时候,十指在键盘上飞舞,那画面太美,我不敢想象. 常用快捷键操作 2.常用代码片段 开发中有一些常用的代码,可以放到代码片段中,然后下次你就可以使用快捷方法来使用这些代码了,给大家看下

提高iOS开发效率的方法和工具

IDE 首先要说的肯定是IDE了,说到IDE,Xcode不能跑,当然你也可能同时在使用AppCode等其他的IDE,在这里我主要介绍Xcode中提升开发效率的方法. 1.善用快捷键 快捷键是开发中必不可少的,当你善于使用快捷键的时候,十指在键盘上飞舞,那画面太美,我不敢想象. 常用快捷键操作 2.常用代码片段 开发中有一些常用的代码,可以放到代码片段中,然后下次你就可以使用快捷方法来使用这些代码了,给大家看下我的Xcode中部分代码片段: 偷懒小技巧 3.Xcode插件 我想插件是Xcode必不