黑马程序员-description的重写

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;
}
   
   
这时候的输出是: <People: 0x100201f50>,此时输出调用了父类,也就是NSObject的description方法,如果我们想要让他能够正确的输出我们所需要的内容的话,我们可以在People类中重写父类中的description方法。

比如:

@interface People:NSObject
{
    @public
    NSString *name;
}
-(NSString *) description;
@end

@implementation People
-(NSString *) description{
    return  [NSString stringWithFormat:@"姓名是%@",name];
}
@end
这时候的输出是:姓名是:xingm  这就是我们想要的结果。

在重写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方法


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值