一:-(NSString *)description;
有时候我们想要打印一下一个对象的内容看一下,
但是当我们采用下面的代码进行打印的时候,结果并不是我们想要的。
Cat *cat = [[Cat alloc]init];
NSLog(@"%@",cat);
输出:
2015-09-25 20:58:52.286 OCStudy[4195:1476050] <Cat: 0x100300660>
我们看到的结果是 类名:对象地址
我们会看到NSObject中有+description这个类方法,同样对象中也有-description方法,并且返回值多是NSString
NSLog中我们打印一个对象的时候,它实际上会调用对象的-description方法,返回一个NSString
这样,我们可以通过重写对象类中的-description方法,从而输出对象中的内容,如下:
//
// Cat.h
// OCStudy
//
// Created by LiuMingchuan on 15/9/25.
// Copyright © 2015年 LMC. All rights reserved.
//
#import "Animal.h"
@interface Cat : Animal
@property (nonatomic,strong) NSString *name;
@property (nonatomic,assign) int sex;
@property (nonatomic,assign) int age;
@property (nonatomic,strong) NSString *address;
@end
//
// Cat.m
// OCStudy
//
// Created by LiuMingchuan on 15/9/25.
// Copyright © 2015年 LMC. All rights reserved.
//
#import "Cat.h"
@implementation Cat
@synthesize name;
@synthesize sex;
@synthesize age;
@synthesize address;
-(NSString *)description {
return [NSString stringWithFormat:@"Cat\n{Name:%@\nSex:%@\nAge:%d\nAddress:%@\n}",self.name,self.sex==0?@"母":@"公",self.age,self.address];
}
@end
Cat *cat = [[Cat alloc]init];
NSLog(@"%@",cat);
输出:
2015-09-25 21:08:14.983 OCStudy[4234:1517797] Cat
{Name:Tom
Sex:公
Age:5
Address:United States of America
}
注意:以前说是在-description中不能使用NSLog打印self,会造成死循环,但是现在似乎不会造成死循环,我试验了一把,没有死循环,但是执行调用了4次,这一块还不太清楚!
二:+(NSString *)description;
同样如果我们想输出类中的信息
Class catClass = [Cat class];
NSLog(@"%@",catClass);
输出
2015-09-25 21:08:14.983 OCStudy[4234:1517797] Cat
我们看到只是输出了类的名字
NSLog中我们打印一个类对象的时候,它实际上会调用类的+description方法,返回一个NSString
同样我们也可以通过修改类的+description方法,指定输出的内容
//
// Cat.m
// OCStudy
//
// Created by LiuMingchuan on 15/9/25.
// Copyright © 2015年 LMC. All rights reserved.
//
#import "Cat.h"
@implementation Cat
+(NSString *)description{
return [NSString stringWithFormat:@"%s",__FUNCTION__];
}
@end
Class catClass = [Cat class];
NSLog(@"%@",catClass);
输出
2015-09-25 21:19:24.253 OCStudy[4278:1573594] +[Cat description]