特别注意:

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

1.NSLog回顾

 

大家都知道,我们可以用NSLog函数来输出字符串和一些基本数据类

1 int age = 11;

2 NSLog( @" age is %d", age);

* 第2行的%d代表会输出一个整型数据,右边的变量age会代替%d的位置进行输出

* 输出结果:

age is 11

2.NSLog输出OC对象

其实,除了可以输出基本数据类型,NSLog函数还可以输出任何OC对象

1 Student *stu = [[Student alloc] initWithAge:10];

2

3 NSLog(@"%@", stu);

4

5 [stu release];

* 在第3行用NSLog函数输出stu对象,注意左边的格式符%@,以后想输出OC对象,就得用%@这个格式符

* NSLog函数一旦发现用%@输出某个OC对象时,就会调用这个对象的description方法(这个方法返回值是NSString类型,是OC中的字符串类型),并且将description方法返回的字符串代替%@的位置进行输出

*上面代码的输出结果为:0x100109910>

Student是类名,0x100109910是对象的内存地址

例子:(没有重写OC中的description方法时)description方法的默认实现是返回这样的格式:<类名: 对象的内存地址>

* 注意了,%@只能用于输出OC对象,不能输出结构体等其他类型

* 有Java开发经验的人应该能感受到OC中的description方法就是Java中的toString方法

3.重写description方法

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

比如,重写Student的description方法,返回成员变量_age的值

1 - (NSString *)description {

2 return [NSString stringWithFormat:@"age=%i", _age];

3 }

* 在第2行调用了NSString这个类的静态方法stringWithFormat初始化一个字符串对象,并返回这个字符串

* 如果你会使用NSLog的话,那就应该能理解第2行的方法参数是什么意思了

* 假如_age是10,那么description方法返回的字符串就是@"age=10"

* 可能有人会觉得奇怪,之前创建的Student对象是需要释放的,为什么这里创建的字符串对象不用释放?要想彻底明白这个问题,需要先了解OC的内存管理,这里我们暂不做详细讨论,后面会有章节详细讨论内存管理。你可以先记住一个规则:一般情况下,静态方法返回的对象,都不用手动释放。

* 重写完description方法后,再次执行下面的代码

Student *stu = [[Student alloc] initWithAge:10];

2

3 NSLog(@"%@", stu);

4

5 [stu release];

1输出结果为:

age=10

4.description方法的陷阱

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

- (NSString *)description {

2 return [NSString stringWithFormat:@"%@", self];

3 }

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

什么情况下才要重写Objective-C中的description方法的更多相关文章

  1. 如何在使用eclipse的情况下,清理android项目中的冗余class文件和资源文件以及冗余图片

    在我们迭代项目的过程中,经常会启用某些功能,或者修改某些界面的问题,那么问题来了,这样很容易出现大量的冗余.java文件,冗余资源文件,一些冗余的界面文件等.那么问题既然出现了,那么如何去解决呢,这就 ...

  2. 第8.26节 重写Python类中的__getattribute__方法实现实例属性访问捕获

    一. 引言 在<第7.23节 Python使用property函数定义属性简化属性访问的代码实现>和<第7.26节 Python中的@property装饰器定义属性访问方法gette ...

  3. 重写Object类中的equals方法

    Object是所有类的父亲,这个类有很多方法,我们都可以直接调用,但有些方法并不适合,例如下面的student类 public class Student { //姓名.学号.年纪 private S ...

  4. Jquery 表格操作,记录分页情况下,每一页中被用户勾选的信息

    如下图,一个分页列表,用户可以随意勾选一条或多条信息,然后进行某种操作,如“提交”.但是有个问题:如果勾选了一条信息之后,点[下一页],那么上一页 勾选的条目被刷新掉了. 问题:如果用户需要在第1页, ...

  5. 终于知道什么情况下需要实现.NET Core中的IOptions接口

    自从接触 IOptions 之后,一直纠结这样的问题:自己定义的 Options 要不要实现 IOptions 接口. 微软有的项目中实现了,比如 Caching 中的 MemoryCacheOpti ...

  6. 无shell情况下的mysql远程mof提权利用方法详解

    扫到一个站的注入<ignore_js_op> 在havij中得到mysql数据库中mysql库保存的数据库密码:<ignore_js_op> 有时候发现1.15版的还是最好用, ...

  7. 配置正确情况下,hadoop 没有namenode的一个解决方法

    将hdfs里name与data清空,和将tmp清空 然后在hadoop目录下运行 hadoop namenode -format 启动   sbin/start-all.sh

  8. mvc不登录的情况下无法跳转至其他页面--解决方法之一

    在每个控制器里,加以下方法 /// <summary> /// 在调用视图之前拦截非法用户 /// </summary> /// <param name="fi ...

  9. 关于在gridview中有dorpdownlist的情况下使用自带编辑模板的方法

    今天记录一下在gridview中,如果有dropdownlist的情况下使用gridview自带编辑模式的方法. 好吧,今天的这个问题有点绕,详细解释一下目的. 因为gridview中的某些列的数据是 ...

随机推荐

  1. PHP中的一些常用正则表达式

    匹配表单验证 验证账号,字母开头,允许 5-16 字节,允许字母数字下划线:^[a-zA-Z][a-zA-Z0-9_]{4,15}$ 验证账号,不能为空,不能有空格,只能是英文字母:^\S+[a-z ...

  2. 从匿名方法到 Lambda 表达式的推演过程

    Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可以写入可作为参数传递或作为函数调用值返回的本地函数. 以上是msdn官网对Lambda 表达式 ...

  3. Delphi使用ADO进行数据库编程

    Delphi是一个可视化的编程工具,ADO编程也是这样,所以话不多言,直接通过代码.截图和语言来说明. 我的数据库是Oracle,为了测试,先建一个表:create table practice(un ...

  4. 使用PowerShell来修改文件访问,创建,修改时间属性

    Function Set-FileTimeStamps { Param ( [Parameter(mandatory=$true)] [string[]]$path, [datetime]$date ...

  5. [LINQ TO SQL]使用LINQ TO SQL创建数据库

    这篇博客将介绍如何使用LINQ TO SQL来创建数据库,以及如何映射Table之间的主外键关系. 我们的数据库表关系如下: Province与City之间1:M,City与Area之间1:M的关系. ...

  6. JS隐形数据类型转换注意事项

    alert('2'===2); //这个结果是false,首先三个等号要比较数据类型,字符串和整数不相等 alert('2'==2);    //这个结果是true,因为是两个等号,所以不会比较数据类 ...

  7. 解决java.beans.Introspector导致的内存泄漏

    解决方案: 在WEB.XML 中配置监听器: <listener> <listener-class> org.springframework.web.util.Introspe ...

  8. JAVABeanUtils

    在写如何使用java BeanUlits 之前需要清楚几件事情 1. 我们每次所定义的类,其实是实体,同时也被称作为JavaBean; 2.  为什么我们要使用BeanUlits这个框架     &g ...

  9. [资料分享]组件方式开发 Web App全站

  10. java与javac命令的功用

    一.javac用来编译java程序,比如说我写了一个Server.java文件,首先通过命令行进入.java文件所在的路径, 然后通过输入 javac Server.java 命令行来完成编译,编译之 ...