1、description方法概述
先看一个例子。我们定义一个Dog类:
创建类Dog: - #import<Foundation/Foundation.h>
- @intface Dog : NSObject
- {
- @public
- int _tuiNum; //定义变量腿的个数
- int _eyeNum; //定义变量眼睛个数
- }
- -(void)run;
- +(void)eat;
- @end
复制代码
实现这个类:- @implementation Dog
- -(void)test{
- NSLog(@"对象方法");
- }
- +(void)test{
- NSLog(@"类方法");
- }
复制代码
main函数中:
- #import<Foundation/Foundation.h>
- #import"Dog.h"
- int main(int atgc,const char *argc[]){
- @autoreleasepool{
- Dog *d=[Dog new]; //创建一个对象d
- NSLog(@"%@",d); //打印这个对象地址
- }
- return 0;
- }
复制代码
打印结果为:<Dog:0x100202280>
descriptong方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)NSLog(@"%@", objectA);这会自动调用objectA的descriptong方法来输出ObjectA的描述信息,description方法是基类NSObject所带的方法,因为其默认实现是返回类名和对象的内存地址,这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法的默认实现。
2、description重写的方法 1)对象的description方法
在Dog.m中我们重写入: - @implementation Dog
- -(void)test{
- NSLog(@"对象方法");
- }
- +(void)test{
- NSLog(@"类方法");
- }
- -(NSString*)description{
- return [NSString stringWithFormat:@"狗腿的个数:%d,狗的眼睛个数:%d",_tuiNum,_eyeNum];
- }
复制代码
OK,现在再运行一下main函数:
- #import<Foundation/Foundation.h>
- #import"Dog.h"
- int main(int atgc,const char *argc[]){
- @autoreleasepool{
- Dog *d=[Dog new];
- d->_tuiNum=4; //给变量赋值
- d->_eyeNum=2; //给变量赋值
- NSLog(@"%@",d); //调用对象description方法
- }
- return 0;
- }
复制代码
打印出结果:狗腿的个数:4,狗的眼睛个数:2
2)类的description方法 类的description方法的重写入跟对象的重写入一样,只需要将-(void)变为+(void)即可。 - +(NSString*)description{
- return @"+开头的方法"; //注意类方法不能调用实例变量
- }
复制代码
main的实现
- int main(int atgc,const char *argc[]){
- @autoreleasepool{
- Dog *d=[Dog new];
- NSLog(@"%@",[d class]); //[d class]为通过对象名获取类对象,或者使用[Dog class]
- }
- return 0;
- }
复制代码
3、description陷阱
千万不要在对象description方法中同时使用%@和self,下面的写法是错误的: - - (NSString *)description {
- return [NSString stringWithFormat:@"%@", self];
- }
复制代码
同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法。
|