黑马程序员——OC语言日志——description方法介绍及重写

本文详细介绍了在Objective-C中如何自定义类方法和对象描述信息,包括对象描述方法的重写以及类描述方法的应用,并指出避免在对象描述方法中同时使用%@和self的陷阱。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

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

1、description方法概述

先看一个例子。我们定义一个Dog类:
创建类Dog:

#import<Foundation/Foundation.h>
@intface Dog : NSObject
{
@public
int _tuiNum;  //定义变量腿的个数
int _eyeNum;  //定义变量眼睛个数
}
-(void)run;        
+(void)eat; 
@end
实现这个类:

@implementation Dog
-(void)test{
NSLog(@"对象方法");

}
+(void)test{
NSLog(@"类方法");

}
main函数中:

#import<Foundation/Foundation.h>
#import"Dog.h"
int main(int atgc,const char *argc[]){
@autoreleasepool{
Dog *d=[Dog new];   //创建一个对象d
NSLog(@"%@",d);     //打印这个对象地址
}
return 0;
}
打印结果为:<Dog:0x100202280>
descriptong方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)NSLog(@"%@", objectA);这会自动调用objectA的descriptong方法来输出ObjectA的描述信息,description方法是基类NSObject所带的方法,因为其默认实现是返回类名和对象的内存地址,这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法的默认实现。

2、description重写的方法

1)对象的description方法

在Dog.m中我们重写入:

@implementation Dog
-(void)test{
NSLog(@"对象方法");

}
+(void)test{
NSLog(@"类方法");

}
-(NSString*)description{
return [NSString stringWithFormat:@"狗腿的个数:%d,狗的眼睛个数:%d",_tuiNum,_eyeNum];
}
OK,现在再运行一下main函数:

#import<Foundation/Foundation.h>
#import"Dog.h"
int main(int atgc,const char *argc[]){
@autoreleasepool{
Dog *d=[Dog new];
d->_tuiNum=4;  //给变量赋值
d->_eyeNum=2;  //给变量赋值
NSLog(@"%@",d); //调用对象description方法
}
return 0;
}
打印出结果:狗腿的个数:4,狗的眼睛个数:2

2)类的description方法

类的description方法的重写入跟对象的重写入一样,只需要将-(void)变为+(void)即可。

+(NSString*)description{
return @"+开头的方法";     //注意类方法不能调用实例变量
}
main的实现

int main(int atgc,const char *argc[]){
@autoreleasepool{
Dog *d=[Dog new];
NSLog(@"%@",[d class]);  //[d class]为通过对象名获取类对象,或者使用[Dog class]
}
return 0;
}

3、description陷阱

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

- (NSString *)description {
    return [NSString stringWithFormat:@"%@", self];
}
同时使用了%@和self,代表要调用self的description方法,因此最终会导致程序陷入死循环,循环调用description方法。




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值