一、简介

  与.NET一样,在.NET上得Object对象有个ToString()方法可以用于输出对象的信息,在iOS上的NSObject也有一个方法,为description,该方法返回objc对象的描述信息,当我们调用NSLog打印一个对象或者NSString格式化输出一个对象的时候,就会调用该方法,NSObject还有另一个方法debugDescription,用于在调试控制台输出信息(在控制台输出对象信息如:po person),默认情况下debugDescription调用的时description方法

二、演示

@interface Person : NSObject

@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger gender;
@property (nonatomic, assign) float weight; @end @implementation Person
@end

Person

Person *person = [[Person alloc] init];
person.name =@"bomo";
person.age = ;
person.weight = ; NSString *logMessage = [NSString stringWithFormat:@"%@", person]; NSLog(@"stringWithFormat: %@", logMessage);
NSLog(@"nslog: %@", person);

默认情况下,object-c对象只输出对象名字和对象的地址,默认的实现应该是这样的

- (NSString *)description
{
return [NSString stringWithFormat:@"<%@: %p>", NSStringFromClass([self class]), self];
}

一般这两个信息对于我们调试没太大帮助,通常我们希望看到类的更多属性的信息,我们可以重写description方法

@interface Person : NSObject

@property (nonatomic, assign) NSUInteger age;
@property (nonatomic, copy) NSString *name;
@property (nonatomic, assign) NSUInteger gender;
@property (nonatomic, assign) float weight; @end @implementation Person - (NSString *)description
{
return [NSString stringWithFormat:@"<Person: %p> {\n\tname=%@,\n\tage=%ld,\n\tweight=%f,\n\tgender=%lu\n}", self, self.name, self.age, self.weight, self.gender];
} @end

输出下面信息

三、抽象基类

  从上面看到,如果我们要为每个model都重写description方法,那就太费劲了,程序员都是很懒的,其实我们可以封装一个通用的方法,通过运行时的API动态获取到对象的类型,并输出,该方法可以给所有的类通用

这里创建一个基类BaseModel,我们在基类实现一个通用的description方法(除了基类的方式,我们也可以重写NSObject的description方法,应为基本上所有的类都集成自NSObject,我们不能拿到NSObject的源代码,objc提供了一种叫method swizzling技术,可以在运行时替换两个方法的实现,我们可以吧NSObject的description换成我们的实现,详情参见:http://www.cnblogs.com/bomo/p/4693363.html

@interface BaseModel : NSObject
@end @implementation BaseModel - (NSString *)description1
{
id modelClass = [self class];
unsigned int outCount, i;
objc_property_t *properties = class_copyPropertyList(modelClass, &outCount); NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:outCount]; //遍历出所有的属性key/value
for (i = ; i < outCount; i++) {
objc_property_t property = properties[i];
NSString *propName = [NSString stringWithUTF8String:property_getName(property)];
id value = [[self valueForKey:propName] description];
[dict setObject:value forKey:propName];
}
return [NSString stringWithFormat:@"<%@: %p> %@", NSStringFromClass([self class]), self, dict];
} - (NSString *)debugDescription
{
return [self description];
} @end

这是我们的Person类只需要继承自BaseModel即可实现如NSDictionary的输出,这里是利用的字典的输出,就不用自己拼字符串

我们也可以只重写debugDescription方法,在调试控制台输出的时候才输出类的所有属性信息,而description保留默认的实现

【iOS】desctiption和debugDescription的更多相关文章

  1. ios视频播放器,代码和界面分离

    最近业余时间整理的一个ios播放器,界面采用storyboard,以前几乎都是用代码布局,但是用过一个项目storyboard后,就感觉storyboard很靠谱,团队合作版本控制的问题解决其实很简单 ...

  2. iOS Webview 实现修改javascript confirm 和 alert

    贴代码: @interface UIWebView (JavaScriptAlert) -(void) webView:(UIWebView *)sender runJavaScriptAlertPa ...

  3. iOS应用动态部署方案

    iOS的动态部署能极大的节约成本.苹果的审核周期很长,有的时候,你可能不得不等待将近2个星期去上架你的新功能或者bug.所以动态部署是有价值的. 我这里讨论的情况不把纯web应用考虑在内,因为用户体验 ...

  4. iOS书摘之编写高质量iOS与OS X代码的52个有效方法

    来自<Effective Objective-C 2.0编写高质量iOS与OS X代码的52个有效方法>一书的摘要总结 一.熟悉Objective-C 了解Objective-C语言的起源 ...

  5. iOS开发之检查更新

    iOS设备检查更新版本: #pragma mark - 检查更新 - (void)checkUpdateWithAPPID:(NSString *)APPID { //获取当前应用版本号 NSDict ...

  6. iOS开发技巧系列---详解KVC(我告诉你KVC的一切)

    KVC(Key-value coding)键值编码,单看这个名字可能不太好理解.其实翻译一下就很简单了,就是指iOS的开发中,可以允许开发者通过Key名直接访问对象的属性,或者给对象的属性赋值.而不需 ...

  7. 【IOS学习基础】NSObject.h学习

    一.<NSObject>协议和代理模式 1.在NSObject.h头文件中,我们可以看到 // NSObject类是默认遵守<NSObject>协议的 @interface N ...

  8. iOS开发之Xcode常用调试技巧总结

    转载自:iOS开发之Xcode常用调试技巧总结 最近在面试,面试过程中问到了一些Xcode常用的调试技巧问题.平常开发过程中用的还挺顺手的,但你要突然让我说,确实一脸懵逼.Debug的技巧很多,比如最 ...

  9. iOS开发之Xcode常用调试(Debug)技巧总结

    一.Xcode调试技巧之:NSLog 上面也提到了,在我们日常的开发过程中最常见的Debug方式就是打Log.而在OC语言中,打Log是采用NSLog方法.但是NSLog效率低下,具体原因可以看这篇博 ...

随机推荐

  1. php实现注册

    <?php header("Content-Type:text/html;charset=gb2312"); @mysql_connect('localhost','root ...

  2. Atitit. 类与对象的存储实现

    Atitit. 类与对象的存储实现 1. 类的结构和实现1 2. 类的方法属性都是hashtable存储的.2 3. Class的分类 常规类(T_CLASS), 抽象类(T_ABSTRACT T_C ...

  3. Atitit oodbms的查询,面向对象的sql查询jpa jpql hql

    Atitit oodbms的查询,面向对象的sql查询jpa jpql hql 1.1. 标准API历史1 1.2. JPA定义了独特的JPQL(Java Persistence Query Lang ...

  4. java异常处理:建立exception包,建立Bank类,类中有变量double balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount),当取款的数额大于存款时,抛出InsufficientFundsException,取款数额为负数,抛出NagativeFundsException,如new Bank(100),

    建立exception包,建立Bank类,类中有变量double  balance表示存款,Bank类的构造方法能增加存款,Bank类中有取款的发方法withDrawal(double dAmount ...

  5. Java语言的个人理解

    Java语言的个人理解(比价深层次吧) 大四的生活确实十分的奢靡,不锻炼,不读书,几乎就是当一天和尚撞一天钟的生活,太颓废了,还好自己不是这个样子,不过身体确实差了很多,昨天跑了一圈内环(4KM),今 ...

  6. SQL Server 2014新特性-原生备份加密

    注:本篇文章是IT68找我的约稿,原文地址:http://tech.it168.com/a2014/0610/1633/000001633147.shtml       SQL Server 2014 ...

  7. Js内存回收

    Javascript的世界中,隐藏了很多内存陷阱,不能得到合理释放的内存会埋下各种隐患,本文旨在以实用角度去解读Js涉及到的内存,且看勇士如何斗恶龙~ javascript 内存 回收 本文可以看做是 ...

  8. Tcl Tk Introduction

    Tcl Tk Introduction eryar@163.com 摘要Abstract:Tcl/Tck脚本可以很容易实现用户自定义的命令,方便的创建图形化的用户界面GUI,所以Tcl和Tk的应用领域 ...

  9. android 手机开启debug日志

    来自 http://blog.csdn.net/aikongmeng/article/details/9764297 真机默认是不开启Log 开关的,这么来说我们如果使用真机来搞程序测试的话,需要做以 ...

  10. CSS三列布局

    × 目录 两侧定宽中间自适应 两列定宽一侧自适应 中间定宽两侧自适应一侧定宽两列自适应三列自适应总结 前面的话 前面已经介绍过单列定宽单列自适应和两列自适应的两列布局.本文介绍三列布局,分为两侧定宽中 ...