黑马程序员——OC语言基础---description方法介绍及重写

                                                                   ------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! -------

description方法介绍及重写

1、description方法概述

description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址);

NSLog(@"%@", objectA);这会自动调用objectAdescriptong方法来输出ObjectA的描述信息,

description方法是基类NSObject所带的方法,因为其默认实现是返回类名和对象的内存地址,这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法的默认实现. 

当程序发现以%@的方式打印一个OC对象的时候,就会给指针变量所指向的对象发送一条description消息;会调用对象的description方法,并且把description方法返回的字符串输出到屏幕上。

2、description重写的方法

//对象的description方法 ,也可以使用点语法;默认返回的是类名和对象的内存地址。
-(NSString*)description
{
    return [NSStringstringWithFormat:@"狗腿的个数:%d,狗的眼睛个数:%d",_tuiNum,_eyeNum];
} 
//类的description方法 ,默认返回的是类名。
+(NSString*)description
{
    return @"+开头的方法";
}

3、description陷阱

千万不要在description方法中同时使用%@和self,下面的写法是错误的:

<span style="font-size:14px;">-(NSString *)description
{
   return [NSString stringWithFormat:@"%@", self];
} </span>

同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法 

<span style="font-size:14px;">#import <Foundation/Foundation.h>
@interface Dog : NSObject
{
    int _age;
    @public
    int _color;
}
-(void)run;
-(void)setAge:(int)age;
-(int)age;
@end
@implementation Dog
-(void)setAge:(int)age{   
    _age = age;
}
-(int)age{    
    return _age;
}
-(void)run{    
    NSLog(@"狗在跑");    
}
//重写父类的description
-(NSString *)description{    
    //    NSString *str= [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];   
    return [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];
}
//重写description的类方法
+(NSString *)description{   
    //在类方法中不能访问实例变量,所以下面的写法是错误的
    //    return [NSString stringWithFormat:@"年龄:%d,颜色:%d",_age,_color];    
    return @"这是类方法";
}
@end
int main(int argc, const char * argv[]) {
    @autoreleasepool {        
        Dog *d = [Dog new];
        [d setAge:3];
        d->_color  = 1;        
        [d run];       
        //查看对象地址
        NSLog(@"\n d = %p",d);        
        //查看对象实例变量的值
        NSLog(@"\n %d",[d age]);       
        //类名    对象的地址
        NSLog(@"\n%@",d); //打印d的对象
        NSLog(@"\n%@ ",[d class]);
    }
    return 0;
}</span>
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值