程序员首页投稿(暂停使用,暂停投稿)手机移动程序开发

实现 description 方法 — 细看信息

2017-01-27  本文已影响99人  47号同学
2017新年快乐2017新年快乐

在调试程序的时候,我们经常需要打印并查看对象信息。一种办法是将对象的全部属性打印出来,另一种是挑选我们需要的信息。

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];
}
可以将此自定义的类作为基类,之后的自定义类继承其,这样就很方便打印出自定义类的全部的属性了。

demo:https://github.com/CrusherWu/description

上一篇下一篇

猜你喜欢

热点阅读