Objective - C基础: 第四天 - 9.description方法
前面讲了一些比较抽象的东西, 类的加载过程以及类别的加载过程, 这次我们来讲讲NSObject自带description方法, 这个方法有两个, 一个是实例方法, 一个是类方法, 下面让我们一起来探究探究吧:
例子:
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @property NSString *name; @end @implementation Person @end int main() { Person *p = [[Person alloc]init]; p.age = 10; p.name = @"Jack"; NSLog(@"%@", p); return 0; }
我们都知道, 如果要把一个对象打印出来, 就要用%@, 这样子就可以把一个对象完整的打印出来, 而不需要我们一个一个打印出里面的成员变量, 但这里存在一个问题, 打印出来的结果却是类名+内存地址, 为什么会这样子呢?? 其实这个就是description方法, 我们来讲讲NSLog的运行原理.
1. 会调用对象p的-description方法.
2. 拿到-description方法的返回值(NSString *)显示到屏幕上
3. -description方法默认返回的是"类名+内存地址"
所以在默认情况下, 利用NSLog和%@输出对象时, 结果是<类名: 内存地址>
但如果我们想输出的结果和我们想的一样, 很简单, 来一个方法重写就OK了~~~
比如:
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @property NSString *name; @end @implementation Person - (NSString *)description { return [NSString stringWithFormat:@"age = %d, name = %@", _age, _name]; } @end int main() { Person *p = [[Person alloc]init]; p.age = 10; p.name = @"Jack"; NSLog(@"%@", p); return 0; }
输出的结果:
2015-01-24 16:26:31.778 08-description方法[11131:1213423] age = 10, name = Jack
其实类方法也是如此, 原理都是差不多的, 通过重写description类方法, 就可以实现我们所需的效果:
#import <Foundation/Foundation.h> @interface Person : NSObject @property int age; @property NSString *name; @end @implementation Person + (void)description { return @"ABCDEFG"; } @end int main() { Class c = [Person class]; NSLog(@"%@", c); return 0; }
结果:
2015-01-24 17:54:00.071 08-description方法[11333:1242977] ABCDEFG
PS:注意, 在- dsecription方法中, 不要再写NSLog(@"%@", self); 这句代码, 否则会引起死循环.
好了, 这次我们就讲到这里, 下次我们继续~~~