在调试程序的时候,我们经常需要打印并查看对象信息。一种办法是将对象的全部属性打印出来,另一种是挑选我们需要的信息。
NSLog(@"obj = %@",obj);
这种打印全部属性只适用于 iOS 原有的对象类型,而自定义的类型将只是输出下面这样的信息:
< Person: 0x6080000258e0>
自定义的类输出的信息并不太有用,所以我们需要自己去实现这个 description 办法。
//
// YYObject.h
// YYLog
#import <Foundation/Foundation.h>
@interface YYObject : NSObject
@property (nonatomic,copy) NSString *firstName;
@property (nonatomic,copy) NSString *lastName;
@end
//
// YYObject.m
// YYLog
#import "YYObject.h"
#import <objc/runtime.h>
@implementation YYObject
- (instancetype)init
{
if (self = [super init]) {
}
return self;
}
-(NSString *)description
{
return [NSString stringWithFormat:@"< %@: %p,firstName: %@,lastName:%@>",[self class],self,_firstName,_lastName];
}
@end
//打印出来的信息如下:
person:< Person: 0x60000002af80,firstName: wu,lastName:yy>
通过自己去实现 description 办法,是可以将我们需要的属性信息打印出来。有一个问题就是如果自定义的类属性很多,逐步去实现属性是很浪费时间的,所以利用 Runtime 进行 description 的改造。
-(NSString *)description
{
NSLog(@"father's description!");
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
unsigned int count = 0;
Ivar *ivars = class_copyIvarList([self class], &count);
for (NSUInteger i = 0; i < count; i ++) {
Ivar ivar = ivars[i];
const char *name = ivar_getName(ivar);
NSString *key = [NSString stringWithUTF8String:name];
id value = [self valueForKey:key];
[dict setObject:value forKey:key];
}
free(ivars);
return [NSString stringWithFormat:@"< %@: %p, %@>",[self class],self,dict];
// return [NSString stringWithFormat:@"< %@: %p,firstName: %@,lastName:%@>",[self class],self,_firstName,_lastName];
}
网友评论