黑马程序员---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培训、期待与您交流! ———

0 0
原创粉丝点击