问题描述:
调试程序时,经常需要打印并查看对象信息。一种比较傻比的方法是把对象的所有属性一一输出到日志中。但是最常用的还是这种直接输出。
NSLog(@"arr = %@",array);
在构建需要打印到日志的字符串时,array对象会收到description消息,该方法所返回的描述信息将取代“各式字符串”(format string)里的“%@”。比方说,object是个数组,若用下列代码打印其信息:
NSArray *array =@[@"lao shi",@"didi",@"hou",@(222)];
NSLog(@"arr = %@",array);
则会输出:
arr = (
"lao shi",
didi,
hou,
222
)
这就是因为description的作用了,但是如果是自定义的类(继承自NSObject类)使用NSLog直接打印该类的对象时,输出的日志则是一串8位的地址值,如:
Student *stu = [[Student alloc] initWithAge:10];
NSLog(@"%@", stu);
则输出为:
<Student: 0x100200ae0>
那么这是什么回事呢?
解决方案:
在自定义类中,重写description方法(一定不能在该方法中使用@ 或self)这样会导致重复调用,引发死循环。
#pragma mark 实例对象输出的结果 - (NSString *)description { // NSLog(@"%@",self); 引发死循环 return [NSString stringWithFormat:@"name = %@ age = %d",_name,_age]; }