OC的description方法
2015-12-20 01:56
260 查看
OC的description方法
在APP的开发过程中,经常要打印并查看对象的信息,比较low的方法是编写代码,把对象的全部的属性都输出到日志中。最常用的做法是NSLog一下。在构建需要打印到日志的字符串时,object对象会收到description消息,该方法所返回的描述信息将取代“格式字符串”里的“%@”等,比如:我们要打印数组时。
NSLog(@"arr = %@", arr);
控制台会输入:
arr = ( "我是数组中的元素" "我也是数组中得元素" )
对应的字典之类的系统自带的类中也会输出相应地信息,然而自定义的类就不是这样的,如果我们直接打印对象(不实现类的description方法)通常会在控制台打出如下信息:
//person 为 Person类的一个对象 person = <Person: 0x7fsjks898939>
与系统自带类相比,这样的输出并没什么鸟用,除非在自己的类中重写的description方法,否则打印信息时就会调用NSObject类所实现的默认方法。此方法定义在NSObject协议中,不过NSObject类实现了它。因为NSObject并不是唯一的“根类”,所以许多方法都要定义在NSObject协议里。比方说,NSProxy也是一个遵循了NSObject协议的“根类”。由于description等方法定义在NSObject协议里,因此像NSProxy这种“根类”及其子类也必须实现它们。如前所见。这些实现好的方法并没有打印出较为有用的信息,只不过是输出了类名和对象的内存地址。只有在你想判断两指针是否真的指向同一对象时,这种信息才有用处。除此之外,再也看不出其他有用的内容。
通常情况下,如果我们想让自定义的类输出更有用的信息只需覆盖description方法并将描述此对象的字符串返回即可,比如:
#import <Foundation/Foundation.h> @interface Person : NSObject @property (nonatomic, copy, readonly) NSString * name; @property (nonatomic, copy, readonly) NSString * address; - (id)initWithName:(NSString *)name address:(NSString *)address; @end @implementation Person - (id)initWithName:(NSString *)name address:(NSString *)address{ if ((self = [super init])){ _name = [name copy]; _address = [address copy]; } return self; } - (NSString *)description{ return [NSString stringWithFormat:@"<%@ : %p, \"%@ %@\">", [self class], self, _name, _address]; } @end
Person类的.h和.m文件如上所示。
这样的话当我们再次打印Person类的对象时,比如:
Person * peron = [Person alloc] initWithName:@"zhangsan" address:@"霾都"]; NSLog(@"person -> %@", person); //Output //peron -> <Person: 0x7fsjks898939, "zhangsan 霾都">
这样就比重写description之前所输出的信息更加清楚了,也更加方便我们在开发过程中得调试。
当然了,还有种更加简单地方法,也比较实用,那就是借助NSDictionary类的description方法,在自定义的description方法中,把待打印的信息放到字典里面,然后将字典对象的description方法所输出的内容包含在字符串里并返回,这样就可以实现精简的信息输出方式,比如还是上面的Person类,这次我们把description方法改写成如下所示:
- (NSString *)description{ return [NSString stringWithFormat:@“%@: %p, %@”, [self class], self, @{@"name":_name, @"address":_address}]; } //NSLog //NSLog(@"%@", person); //output: //person = <Person: 0x7fsjks898939, { name = zhangsan; address = 霾都; }>
怎么样?是不是比上一个还要好点,这样做的也很方便在自定义类中增加,删除和修改属性。
NSObject协议中还有一个方法在程序的调试中,当我们需要用到po命令时需要注意,那就是debugDescription,具体原理和description差不多,也就是没实现debugDescription时,当我们po一个对象时,控制台打印出的信息也就顶多一个内存地址,不方便我们调试程序,这是实现debugDescription,其中返回的数据格式和我们最终改写的description方法一样就ok了,这样我们就可以在程序的运行过程中方便的打断点,po对象,调试程序,而不用一遍又一遍的终止程序,添加NSLog语句了。
相关文章推荐
- OC - 9.基于Quartz2D绘制下载进度条(demo)
- oc 的一些概念
- NSLog 格式
- [代码例程] iPhone开发入门(7)--- 从C/C++语言到Objective-C语
- IOS 面试习题 Object-C
- objective-c block 讲解
- IOS求职之OC面试题
- iOS OC和Swift混编
- 第三方库CocoaLumberjack的简单使用
- OC_继承,初始化
- OC 省市区划分
- iOS开发 — Quartz 2D知识点应用 (制作了一个Demo,源代码)
- OC 书签管理系统
- 编写 Objective-C 代码/掌握基本的编程技能 之 读后笔记
- Swift 和 OC 混编
- 利用UIScrollView实现展示图片的无限滚动及自动滚动
- Objective-C 类,对象,属性,方法
- Objective - C 字符串 数组 字典 集合的基本使用
- 图形上下文解释CGContextSaveGState/CGContextRestoreGState
- Objective-C更改placeholder字体颜色