黑马程序员---description方法(NSLog输出)
来源:互联网 发布:好的视频剪辑软件 编辑:程序博客网 时间:2024/06/05 17:56
———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
-description方法
如果一个类有很多属性,而我们想把这些属性全都输出,那么首先想到的就是一个个的输出,但是这样太麻烦了,所以我们想找一个可以一次性输出所有属性的方法:直接输出对象
我们知道OC字符串也是一个对象
NSString *name = @"Lizzie";
NSLog(@"%@",name); // 打印这个字符串用的是%@,所以打印对象也用%@
所以直接打印对象,如下:
NSLog(@"%@",p); // p是Person类的对象,输出对象用%@
运行后发现,这一句打印的是:<类名: 内存地址>
所以说默认情况下:利用NSLog和%@输出对象时,结果是:<类名:内存地址>
NSLog(@"%@",p);这个输出语句一共进行了两步:
1.调用对象p的-description方法,返回值是字符串数据
2.拿到-description方法返回值(NSString *)显示到屏幕上
-description方法默认返回的是"类名+内存地址"
在NSObject的声明中可以看到有一个+ (NSString *)description;的方法,这说明所有继承自NSObject的类都有+description这个类方法。同时它也有一个的description的对象方法,即- (NSString *)description;这个方法不定义在NSObject的声明中。那如果我们想按照自己的需要输出的话,就需要重写-description方法了,如输出上述Person类中的_age和_name;
因为-description方法返回的是一个字符串,所以我们需要把_age和_name拼起来,连成一个字符串,这时候就要用到NSString类的一个类方法,也就是连接字符串的方法 stringWithFormat:(NSString *) , ...
<span style="font-size:14px;"><span style="font-size:14px;">//重写-description方法- (NSString *)description{ return [NSString stringWithFormat:@"age=%d,name=%@",_age,_name];}</span></span>然后直接打印对象就可以看到屏幕上输出的是我们想要的属性了。
注意:不可以在-description中输出一个self,如:NSLog(@"%@",self); ,这样会引发死循环。因为首次调用这个对象时,调用了-description方法,而这个方法里边又用NSLog输出这个对象,再一次调用-description,如此一直循环
+description方法
刚说了还有一个+description,那么现在我们就来看看它的使用场合。如下:
Class c = [Person calss]; // 获取Person的类对象
NSLog(@"%@",c); // 直接打印类对象
运行发现直接打印类对象输出的是类名Person
当我们打印类对象的时候,它首先会调用+description方法,然后拿到-description方法返回值(NSString *)显示到屏幕上,如果想更改类的输出,那么就需要重写+description方法了
-description决定了实例对象的输出结果,+description决定了类对象的输出结果
小结:
-description方法
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出
+ description方法
使用NSLog和%@输出某个类对象时,会调用类对象+description方法,并拿到返回值进行输出
修改NSLog的默认输出
重写-description或者+description方法即可
死循环陷阱
如果在-description方法中使用NSLog打印self
输出补充
输出当前函数名 : NSLog(@"%s\n",__func__);
输出行号 :NSLog(@"%d",__LINE__);
注意:NSLog输出C语言字符串的时候,不能有中文, NSLog(@"%s",__FILE__);
输出源文件的名称 : printf("%s",__FILE__);
指针变量地址 : NSLog(@"%p",&p);
对象地址 : NSLog(@"%p",p);
输出对象,默认格式:<类名:对象地址> : NSLog(@"%@",p);
__FILE__ :源代码文件名
__LINE__ :NSLog代码在第几行
_cmd :代表着当前方法的SEL
// 下面的代码会引发死循环
- (void)test {
[selfperformSelector:_cmd];
}
———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ———
- 黑马程序员---description方法(NSLog输出)
- 黑马程序员-- ID init(构造方法) Class NSLog description SEL
- 黑马程序员-description,NSLog补充以及SEL
- 黑马程序员----objective-C description NSLog SEL
- NSObject的描述(+description)方法和对象的描述(-description)方法,NSLog默认输出的修改(后知后觉)
- 黑马程序员-OC-description方法
- 10.黑马程序员-description方法、SEL
- 黑马程序员---Objective-C Description方法
- 黑马程序员---description方法
- 黑马程序员——几个NSLog的输出功能补充
- 黑马程序员-------description
- 黑马程序员---oc description
- iOS 简单总结:description方法/NSLog函数
- oc笔记<6>description方法与NSLog
- 黑马程序员-OC-自定义构造方法和description方法
- 黑马程序员-------OC----构造方法和description方法
- 黑马程序员——OC基础---核心语法(id,构造方法,Category,description,SEL)
- 13、黑马程序员-OC语言description方法和sel
- 重温 const 指针
- [Selenium Web Driver]Click on SVG element
- 用两个栈实现一个队列的功能
- 对Dijkstra算法原理的一些理解
- jquery中的常用事件bind、hover、toggle等示例介绍
- 黑马程序员---description方法(NSLog输出)
- Centos6.4 +Hadoop 1.2.1集群配置
- jsp中kindeditor富文本编辑器的使用
- Android基础之——startActivityForResult启动界面并返回数据,上传头像
- [1003]Hangover(水题)
- android开发
- activeMQ数据消费了,但是在中间站却没有删除数据的原因
- servlet(4) - servletAPI - 小易Java笔记
- ASP.net表格Gridview行编辑