------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------
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方法。