------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
description方法介绍及重写
1、description方法概述
description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址);
NSLog(@"%@", objectA);这会自动调用objectA的descriptong方法来输出ObjectA的描述信息,
description方法是基类NSObject所带的方法,因为其默认实现是返回类名和对象的内存地址,这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法的默认实现.
当程序发现以%@的方式打印一个OC对象的时候,就会给指针变量所指向的对象发送一条description消息;会调用对象的description方法,并且把description方法返回的字符串输出到屏幕上。
2、description重写的方法
//对象的description方法 ,也可以使用点语法;默认返回的是类名和对象的内存地址。
-(NSString*)description
{
return [NSStringstringWithFormat:@"狗腿的个数:%d,狗的眼睛个数:%d",_tuiNum,_eyeNum];
}
//类的description方法 ,默认返回的是类名。
+(NSString*)description
{
return @"+开头的方法";
}
3、description陷阱
千万不要在description方法中同时使用%@和self,下面的写法是错误的:
<span style="font-size:14px;">-(NSString *)description
{
return [NSString stringWithFormat:@"%@", self];
} </span>
同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法
<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
int _age;
@public
int _color;
}
-(void)run;
-(void)setAge:(int)age;
-(int)age;
@end
@implementation Dog
-(void)setAge:(int)age{
_age = age;
}
-(int)age{
return _age;
}
-(void)run{
NSLog(@"狗在跑");
}
//重写父类的description
-(NSString *)description{
// NSString *str= [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];
return [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];
}
//重写description的类方法
+(NSString *)description{
//在类方法中不能访问实例变量,所以下面的写法是错误的
// return [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];
return @"这是类方法";
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
Dog *d = [Dog new];
[d setAge:3];
d->_color = 1;
[d run];
//查看对象地址
NSLog(@"\n d = %p",d);
//查看对象实例变量的值
NSLog(@"\n %d",[d age]);
//类名 对象的地址
NSLog(@"\n%@",d); //打印d的对象
NSLog(@"\n%@ ",[d class]);
}
return 0;
}</span>