1.NSLog回顾

众所周知,我们可以用NSLog函数来输出字符串和一些基本数据类

1 int age = 11;
2 NSLog(@"age is %i", age);

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

* 输出结果:

2013-04-19 21:43:47.674 构造方法[483:303] 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方法返回的字符串代替%@的位置进行输出

* description方法的默认实现是返回这样的格式:<类名: 对象的内存地址>,因此上面代码的输出结果为:

2013-04-19 21:46:49.896 构造方法[492:303] <Student: 0x100109910>

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

* 注意了,%@只能用于输出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方法后,再次执行下面的代码

1 Student *stu = [[Student alloc] initWithAge:10];
2
3 NSLog(@"%@", stu);
4
5 [stu release];

输出结果为:

2013-04-19 22:09:56.625 构造方法[531:303] age=10

4.description方法的陷阱

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

1 - (NSString *)description {
2 return [NSString stringWithFormat:@"%@", self];
3 }

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

description方法的更多相关文章

  1. 什么情况下才要重写Objective-C中的description方法

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

  2. OC 初识NSString,self关键字,继承,成员变量的可见性,description方法

    OC 初识NSString,self关键字,继承,成员变量的可见性,description方法 初识 NSString: char * string = "旭宝爱吃鱼"; 常量字符 ...

  3. CO-类的本质、description方法

    类的本质 1. 类也是个对象 其实类也是一个对象,是Class类型的对象,简称“类对象” Class类型的定义 typedef struct objc_class  *Class; 类名就代表着类对象 ...

  4. OC基础--description方法

    PS:经过之类重写description方法后,个人感觉有点像C#中的ToString();方法 一.description方法的作用:(输出所有的OC对象都用%@) 1.默认情况下(不重写descr ...

  5. 李洪强iOS开发之【Objective-C】07-自定义构造方法和description方法

    知识回顾 在前面已经介绍了如何定义类和创建并初始化对象,比如有Student这个类 1.Student.h 1 #import <Foundation/Foundation.h> 2 3 ...

  6. Objective-C运行时编程 - 实现自动化description方法的思路及代码示例

    发布自米高 | Michael - 博客园,源地址:http://www.cnblogs.com/michaellfx/p/4232205.html,转载请注明. 本文结构 基础实现 性能优化 参考 ...

  7. iOS 简单总结:description方法\NSLog函数

    1.description方法是NSObject自带的方法,包括类方法和对象方法 + (NSString *)description; // 默认返回 类名 - (NSString *)descrip ...

  8. 类的本质、description方法、SEL、NSLog输出增强

    一.类的本质 1.类也是个对象 其实类也是一个对象,是Class类型的对象,简称“类对象” Class类型的定义 typedef struct objc_class *Class; 类名就代表着类对象 ...

  9. [Objective-c 基础 - 2.10] description方法

    A. 实例对象打印-description 1.当使用NSLog函数并且使用%@占位符的时候,会调用对象的-description方法 2.拿到-description的返回值,显示到console中 ...

  10. 【Objective-C】2.自定义构造方法和description方法

    1.Student.h 1 #import <Foundation/Foundation.h> 2 3 @interface Student : NSObject { 4 int _age ...

随机推荐

  1. ORM实例介绍

    http://blog.csdn.net/RonoTian/article/details/2900714

  2. 最小可用 Spring MVC 配置

    [最小可用 Spring MVC 配置] 1.导入有概率用到的JAR包, -> pom.xml 的更佳实践 - 1.0 <- <project xmlns="http:// ...

  3. 【c++习题】【17/4/13】stack

    1.stack 模板.动态内存分配.析构 #include "stack2.cpp" #include <iostream> using namespace std; ...

  4. MySQL Binlog解析(2)

    一.TABLE_MAP_EVENT Used for row-based binary logging beginning with MySQL 5.1.5.The TABLE_MAP_EVENT d ...

  5. centos 安装 mysql-5.7.23-linux-glibc2.12-x86_64.tar.gz 详细步骤

    1.卸载Linux系统上自带的mysql插件(old版本) 查找mysql相关安装: rpm -qa|grep -i mysql 可能会出现以下的一个或多个,没有更好,说明你的系统很干净,但是以防万一 ...

  6. LeetCode——Maximum Depth of Binary Tree

    LeetCode--Maximum Depth of Binary Tree Question Given a binary tree, find its maximum depth. The max ...

  7. on绑定阻止冒泡失败

    使用zepto库,有如下dom <div id="J_parent"> <a href="#"> <span>点我有惊喜&l ...

  8. No toolchains found in the NDK toolchains folder for ABI with prefix

    通过Android Studio 的Sdk Manager安装NDK,安装完之后编译失败,报错信息如下: No toolchains found in the NDK toolchains folde ...

  9. 图片qq浏览器不显示,微信显示问题原因

    1.qq浏览器关闭云加速就可以了

  10. power shell添加vim

    1.去Vim官网下载适合操作系统的可执行文件 地址:https://www.vim.org/download.php#pc 2.找到Vim文件夹中的vimrc文件进行修改,增加下面这4行. set e ...