实现 description 方法 — 细看信息

作者: 47号同学 | 来源:发表于2017-01-27 20:33 被阅读99次
    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

    相关文章

      网友评论

        本文标题:实现 description 方法 — 细看信息

        本文链接:https://www.haomeiwen.com/subject/nsafittx.html