OC中NSlog方法除了可以输出基本数据类型,NSLog函数还可以输出任何OC对象。
如果我们使用NSlog来打印一个对象,比如:
#import
@interface People:NSObject
{
@public
NSString *name;
}
@end
@implementation People
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
People *p=[People new];
p->name=@"xingm";
NSLog(@"%@",p);
}
return 0;
}
比如:
@interface People:NSObject
{
@public
NSString *name;
}
-(NSString *) description;
@end
@implementation People
-(NSString *) description{
return [NSString stringWithFormat:@"姓名是%@",name];
}
@end
在重写description的过程中要特别注意,NSObject中有两个description方法,一个类方法,一个对象方法,如果我们把刚才代码中重写description的-变为+,那么就会出错,因为在类方法中是无法访问成员变量的。
而类方法description重写之后,我们修改代码,将输出变为[p class],我们可以看到,输出是:leiming。不再是people。代码如下:
#import
@interface People:NSObject
{
@public
NSString *name;
}
-(NSString *) description;
@end
@implementation People
-(NSString *) description{
return [NSString stringWithFormat:@"姓名是%@",name];
}
+(NSString *) description{
return [NSString stringWithFormat:@"leiming"];
}
@end
int main(int argc, const char * argv[]) {
@autoreleasepool {
// insert code here...
People *p=[People new];
p->name=@"xingm";
NSLog(@"%@",[p class]);
}
return 0;
}
最后我们需要特别注意的是:
千万不要在description方法中同时使用%@和self,下面的写法是错误的:
-(NSString *) description{
return [NSString stringWithFormat:@"姓名是%@",self];
}
第2行同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法