iOS模型打印

#import <objc/runtime.h>

- (NSString *)description
{
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    uint count;
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    for (int i = 0; i < count; i++)
    {
        objc_property_t property = properties[i];
        NSString *name = @(property_getName(property));
        id value = [self valueForKey:name]?:@"nil";
        [dictionary setObject:value forKey:name];
    }
    
    free(properties);
    return [NSString stringWithFormat:@"<%@:%p> -- %@", [self class], self, dictionary];
    
}

很多时候,我们在断点调试的时候,并不是使用NSLog(@"%@",model);来打印模型,而是通过po这个命令,我们需要重写debugDescription方法而不是description方法

debugDescription方法只会在调试po的时候调用,而在代码中打印不会调用。但是我们需要在每个模型中都重写这个方法,而且代码都不一样,肯定受不了。我的解决方式是写一个NSObject的分类NSObject+DebugDescription并重写debugDescription,并处理了po其他类型的情况

#import "NSObject+DebugDescription.h"
#import <objc/runtime.h>

@implementation NSObject (DebugDescription)

- (NSString *)debugDescription
{
    if ([self isKindOfClass:[NSArray class]] || [self isKindOfClass:[NSDictionary class]] || [self isKindOfClass:[NSNumber class]] || [self isKindOfClass:[NSString class]])
    {
        return self.debugDescription;
    }
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    uint count;
    objc_property_t *properties = class_copyPropertyList([self class], &count);
    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 [NSString stringWithFormat:@"<%@: %p> -- %@", [self class], self, dictionary];
}

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

推荐阅读更多精彩内容

  • 在开发当中,我们很多时候需要打印模型的所有属性。如果我们直接使用NSLog(@"%@",model);的方式,打印...
    小明的知识库阅读 8,305评论 8 53
  • 很久没有写一些纯原创的文章了。有时候当自己知道的东西越多,才发觉自己越无知。相比那些国外牛逼的大神,自己写的东西根...
    纸简书生阅读 5,784评论 1 4
  • 余秋雨先生曾说,流浪是一种告别,告别的原因有的可付诸言表,有的则难以言表,真正的流浪大多属于后者。被迫言表,...
    时光不将就阅读 1,579评论 0 2
  • 问题:我在15年就学习这个体系,我给自己定了两个目标,一个是要成为成功的榜样帮助很多人;另一个是看见空性,但是每天...
    姚老师的空中课堂阅读 6,469评论 1 17
  • 第三十七章 谢星磊拉着甄染回到办公室门外,“你在这里等我一会儿,我收拾一下和你一起回去。” 甄染回过神儿,人已经站...
    文芷阅读 1,891评论 0 0