黑马程序员_description方法
1. -description方法
使用NSLog和%@输出某个对象时,会调用对象的-description方法,并拿到返回值进行输出.
2. +description方法
使用NSLog和%@输出某个类对象时,会调用类对象的+description方法,并拿到返回值进行输出.
3.修改NSLog的默认输出
* 重写 -description 方法或者 +description 方法即可
4.死循环陷阱
* 如果在-description方法中使用NSLog打印self
#import <Foundation/Foundation.h.
@interface Person : NSObject
@property int age;
@priperty NSString * name;
@end
@implementation Person
// 决定了实例对象的输出结果
- (NSString *)description
{
// 下面代码会引发死循环
// NSLog (@"%@", self);
return [NSString stringWithFormat:@"age = %d, name = %@", _age, _name);
}
// 决定了类对象的输出结果
+ (NSString *)description
{
return @"abc";
}
@end
void test9()
{
// 输出当前函数名
NSLog (@"%s", __func__);
}
int main()
{
// 输出代码行号
NSLog (@"%d", __LINE__);
// NSLog输出C语言字符串的时候不能有中文
// NSLog (@"%s", __FILE__);
// 输出源文件的名称
printf("%s\n", __FILE__);
NSLog (@"%s", __func__);
Person *p = [[Person alloc] init];
// 指针变量的地址
NSLog (@"%p", &p);
// 对象的地址
NSLog (@"%p", p);
// <类名 : 对象地址>
NSLog (@"%@", p);
return 0;
}
void test2()
{
Class c = [Person class];
// 1.会调用类的+description方法
// 2.拿到+description方法的返回值(NSString *)显示到屏幕上
NSLog (@"%@", c);
}
void test1()
{
Person *p = [[Person alloc] init];
p.age = 20;
p.name = @"Jack";
// 默认情况下,利用NSLog和%@输出对象时,结果是:<类名: 内存地址>
// 1.会调用对象p的-description方法
// 2.拿到-description方法的返回值(NSString *)显示到屏幕上
// 3.-description方法默认返回的是“类名+内存地址”
// NSLog (@"%@", p); // 打印对象p的地址
NSLog (@"%@", p);
Person *p2 = [[Person alloc] init];
p2.age = 25;
p2.name = @"Jake";
NSLog (@"%@", p2);
}