iOS 让控制台以字典形式打印出model的所有属性

1.description介绍:

1.NSLog(@"%@", objectA);这会自动调用objectA的description方法来输出ObjectA的描述信息.

1.2.description方法默认返回对象的描述信息(默认实现是返回类名和对象的内存地址)
1.3.description方法是基类NSObject 所带的方法,因为其默认实现是返回类名和对象的内存地址, 这样的话,使用NSLog输出OC对象,意义就不是很大,因为我们并不关心对象的内存地址,比较关心的是对象内部的一些成变量的值。因此,会经常重写description方法,覆盖description方法 的默认实现
2.debugDescription简介:

debugDescription方法是开发者在调试器中以控制台命令打印对象时才调用的。在NSObject类的默认实现中,此方法只是直接调用了description。

在开发过程中, 往往会有很多的model来装载属性. 而在开发期间经常会进行调试查看model里的属性值是否正确. 那么问题来了, 在objective-c里使用NSLog("%@",model)这行代码打印出来的却是model的地址. 不是我们所想要的结果,这样往往不利于调试。所以我们需要给NSObject添加一个分类去重写

  • (NSString *)description方法。如下代码:
// 重写debugDescription, 而不是description
- (NSString *)debugDescription {
    //判断是否时NSArray 或者NSDictionary NSNumber 如果是的话直接返回 debugDescription
    if ([self isKindOfClass:[NSArray class]] || [self isKindOfClass:[NSDictionary class]] || [self isKindOfClass:[NSString class]] || [self isKindOfClass:[NSNumber class]]) {
        return [self debugDescription];
    }
    //声明一个字典
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    //得到当前class的所有属性
    uint count;
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    
    //循环并用KVC得到每个属性的值
    for (int i = 0; i<count; i++) {
        objc_property_t property = properties[i];
        NSString *name = @(property_getName(property));
        id value = [self valueForKey:name]?:@"nil";//默认值为nil字符串
        [dictionary setObject:value forKey:name];//装载到字典里
    }
    
    //释放
    free(properties);
    
    //return
    return [NSString stringWithFormat:@"<%@: %p> -- %@",[self class],self,dictionary];
}

实现效果如下:

屏幕快照 2017-08-11 下午3.41.32.png

github地址

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 转至元数据结尾创建: 董潇伟,最新修改于: 十二月 23, 2016 转至元数据起始第一章:isa和Class一....
    40c0490e5268阅读 1,767评论 0 9
  • Android 自定义View的各种姿势1 Activity的显示之ViewRootImpl详解 Activity...
    passiontim阅读 173,142评论 25 708
  • 轩泽瘫在椅子上,“不会的,不会的。”口中一直喃喃着。 阿雪看见轩泽的样子,吓了一跳:“阿泽,你怎么了?”轩泽回过神...
    月下紫狸阅读 238评论 0 0
  • 卸载游戏后寂寞空虚冷,来聊聊游戏吧 王者荣耀不一定是款好游戏,但一定是一款成功的游戏 去年王者荣耀横空出世,干掉阴...
    如光不息阅读 446评论 1 5
  • 收到了Rita寄的贺卡、书、本子,大红封面的本子我很喜欢,一同寄来的还有Rita用心挑选的书。 又一次被真诚着的用...
    藕花深处碎碎念阅读 159评论 0 1