*写在前面:看到一个菜鸟写的文章都有人在看,表示有些受宠若惊——虽然还没有点赞的,但是我相信以后写得好一些的时候会有的。 *
重写 Description方法
情景重现:今天在学习OC的时候,老师用到了重写description方法的用法。
```bash
- (NSString *)description
{
return [NSString stringWithFormat:@"name = %@,age = %i,gender = %c",_name,_age,_gender];
}
作为一个菜鸟,只知道跟着老师敲代码,却不知道为什么要重写,有什么意义?(其实老师讲过,忘了,记性不好)
直到…
所有的代码都敲完了之后 ,需要输出信息:
> name = xiaoming,age = 13,gender = M
而我没有跟上老师的节奏,漏输入了显示代码 ,不知道应该怎么输出,下来只能自己想问题出在哪儿。我以为的输出代码会是…
这样:
NSLog(@"name = %@, age = %d , gender = %c",_name,_age,_gender);
那么我应该把这句代码写在哪儿?
写在main.m里面?不行呀,会报错…
那难道是使用方法调用(这时我只能猜想是否description方法有输出的功能并加以尝试)
[Person description];
//Person是重写description方法的类。
当然,这样调用结果也不对!(大神们请不要嘲笑,真不懂)
然后试着将NSLog写在重写description方法的{ }里面,结果系统提示:
Code will never be executed
代码将永远不会被执行!
又试了放在如下代码中
- (instancetype)initWithName:(NSString *)name andAge:(int)age andGender:(char)gender
{
self = [super init];
if (self) {
_name = name;
_age = age;
_gender = gender;
NSLog(@"name = %@, age = %d , gender = %c",_name,_age,_gender);
}
return self;
}
倒是可以输出了,可是总感觉这样好像不太对,至于为什么不对,只是一种感觉 。并且后来我核对视频的时候老师也没有在这里输入这样的代码。
这时内心是有些崩溃的!!!
算了,还是自己去啃官方文档吧:
先看关于[NSString stringWithFormat]的官方定义:
Returns a string created by using a given format string as a template into which the remaining argument values are substituted.
返回一个用给定格式创建的字符串并作为一个模板将其余的参数传递到其中(英文水平着急)
不知其所以然…
再看- (NSString *)description的官方定义
https://developer.apple.com/library/archive/documentation/Cocoa/Conceptual/Strings/Articles/FormatStrings.html#//apple_ref/doc/uid/20000943
Returns a string that describes the contents of the receiver.
返回描述接收方内容的字符串
给出了使用示范:
This method is used to create a textual representation of an object, for example in a formatted string:
ClassName *anObject = <#An object#>;
NSString *string = [NSString stringWithFormat:@"anObject is %@", anObject];
虽然明确了一点:知道这个方法应该这么用。可是我想要知道的是在哪里输出我的结果?
没办法了,某度查资料。记得有一个网页上面是这么解释的: 如果不重写description方法,在输出的时候输出的会是个地址,重写description方法输出的才是值(原文被关掉找不到了,大概是这么写的,不够严谨呀!)。
依然没有理解的我只得去重新看了一遍视频,仔细查找是哪里出了问题?大概知道是没有输出的关系,可我不知道代码放哪儿!于是乎看到了
//创建Student类的对象指针 *stu
Student *stu = [[Student alloc]initWithName:@"xiaoming" andAge:13 andGender:'M'];
NSLog(@"%@",stu);//输出对象 我就是漏了这一句
//下面这一句是作参考用的错误示范
//NSLog(@"name = %@, age = %d , gender = %c",_name,_age,_gender);
终于一下理解了前面查到的资料。
NSString stringWithFormat的的作用是把name,age,gender的值格式化为一个字符串(即把分别定义的name,age,gender变量格式化成{name,age,gender}这样的一个整体的字符串(对象))。输出也不是用的我上面代码中的错误的示范,而是创建一个对象,然后用NSLog输出的时候直接调用指针*stu输出对象的值(NSLog(@"%@",stu);。
这就解释了为什么前面查到的资料会说如果不重写description方法会输出内存地址这样的解释来。
因为如果不重写description方法,在调用对象指针stu的时候,只能输出对象指针的值,即内存地址。
而Student的对象是被init成带3个参数的对象,而不是一个具体的值,当重写description方法之后,Student的对象会被格式化为一个字符串(即name,age,gender),然后对象指针stu指向的就是这个字符串,输出的当然也就是这个字符串的值了。
最后以调试成功的输出来结束这篇文章吧,看官轻拍
2020-04-06 22:58:30.045439+0800 School[68162:5441321] name = xiaoming,age = 13,gender = M
2020-04-06 22:58:30.045780+0800 School[68162:5441321] eating apple
2020-04-06 22:58:30.045817+0800 School[68162:5441321] sleeping 8 hour(s)
2020-04-06 22:58:30.045848+0800 School[68162:5441321] studying Objective C
2020-04-06 22:58:30.045916+0800 School[68162:5441321] name = xiaoming,age = 13,gender = M
2020-04-06 22:58:30.045942+0800 School[68162:5441321] eating orange
2020-04-06 22:58:30.045963+0800 School[68162:5441321] sleeping 7 hour(s)
2020-04-06 22:58:30.045989+0800 School[68162:5441321] teaching Objective C
Program ended with exit code: 0
写了一大堆,算是一个自学的初学者在学习路上对自己的一种吐槽,大学的时候没有好好的学,现在再来重新开始,真的是很难!希望大家不要嘲笑,也不知道看官们能不能看懂——我自己写的都有点吃力,似乎还没有完全吃透。
文末彩蛋:
当NSLog(@“name = %@, age = %d , gender = %c”,_name,_age,_gender); 这句写在init方法里的时候也能输出结果。因为需要调试输出的会是一个地址这种现象,所以过程中我将重写的description方法注释掉,结果对在init方法中的输出语句并不受影响,依然输出了结果,description看起来并没有起到什么作用。其实私以为这个时候的description是作用了的,只是没有被显示出来,当用NSLog输出对象的时候才能显示它的作用。
参考的一些资料:
iOS 简单使用description方法
https://www.jianshu.com/p/08b59e425d2c
重写description的方法:
https://blog.youkuaiyun.com/cccccc1990/article/details/101718106
后来重新找的一个比较简明的资料也贴出来给大家看看
什么情况下才要重写OC中的Description方法