description介绍
description方法是NSObject自带的方法,返回值类型是NSString类型。当使用%@打印对象,会调用对象方法-(NSString *)description方法;使用%@打印类时,会调用+(NSString *)description方法;
在使用%@打印对象的时候,我们知道,如果对象是NSString类型的,那么打印内容就是对象字符串,但是其他的非NSString对象,则是打印<类名:内存地址>( <Dog: 0x1001030d0>)。这种打印结果在实际中并没有什么意义,因为使用者并不会关心内存,而使关心需要打印什么信息,所以需要重写NSObject的-(NSString *)description方法。
同理,在使用%@打印类的时候,NSLog(@"%@",[str class]),我们知道,打印的结果只是类名,并没有什么实际意义,所以也需要重写+(NSString)description方法
重写description对象方法和类方法
Person.h文件
#import <Foundation/Foundation.h>
@interface Person : NSObject
@property(nonatomic,assign)int age;
@property(nonatomic,copy)NSString *name;
@end
Person.m文件
#import "Person.h"
@implementation Person
-(NSString *)description{
NSString *str = [[NSString alloc]initWithFormat:@"姓名:%@ ,年龄:%d",_name,_age];
return str;
//return [[NSString alloc]initWithFormat:@"姓名:%@ ,年龄:%d",_name,_age];
}
+(NSString *)description{
//NSString *str = [[NSString alloc]initWithFormat:@"姓名:%@ ,年龄:%d",_name,_age];---这种写法是错误的,不能在类方法中,是不能够访问实例变量的
return @"这是类方法";
}
@end
循环调用description问题
Dog.h文件
#import <Foundation/Foundation.h>
@interface Dog : NSObject
@property(nonatomic,assign)int age;
@end
Dog.m文件
#import "Dog.h"
@implementation Dog
-(NSString *)description{
return [[NSString alloc]initWithFormat:@"%@",self];//-------死循环,编译的时候不会出错,执行的时候才报错
}
+(NSString *)description{
return [[NSString alloc]initWithFormat:@"%@",self];//-------死循环,编译的时候并不会出错,执行的时候才会报错
}
@end