Objective

前面讲了一些比较抽象的东西, 类的加载过程以及类别的加载过程, 这次我们来讲讲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); 这句代码, 否则会引起死循环.




好了, 这次我们就讲到这里, 下次我们继续~~~

原文地址:https://www.cnblogs.com/iOSCain/p/4282832.html