实现 description 方法 — 细看信息

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

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • 国家电网公司企业标准(Q/GDW)- 面向对象的用电信息数据交换协议 - 报批稿:20170802 前言: 排版 ...
    庭说阅读 14,019评论 6 13
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 176,067评论 25 709
  • 123.继承 一个类可以从另外一个类继承方法,属性和其他特征。当一个类继承另外一个类时, 继承类叫子类, 被继承的...
    无沣阅读 5,274评论 2 4
  • 前言 本文主要内容是对iOS的WebViewJavascriptBridge源码进行分析梳理,分为iOS端调用JS...
    EA88阅读 5,179评论 0 1
  • 我说我是一条波涛汹涌的河流, 浪花欢快地拍打着你的心岸, 愉悦的回声传扬到四方。 你说你不喜欢这惊涛骇浪, 你怕它...
    天堂里的鱼阅读 1,495评论 0 0

友情链接更多精彩内容