OC:断点调试打印自定义模型(展示model属性)

说明
首次发布 2017年06月23日
最近更新 2019年06月08日

背景:在开发中,如果我们直接使用 NSLog(@"%@", model);打印出来只是自定义 model 的内存地址,但我们需要查看模型内的所有属性的值,就需要重写- (NSString *)description- (NSString *)debugDescription

一、 关于- (NSString *)description- (NSString *)debugDescription的异同点:

  • 异:
    - (NSString *)description: 是从控制台输出,比如NSLog(@"%@", model);
    - (NSString *)debugDescription:通过断点po打印。
  • 同:
    输出信息是一样的,因为我们都是遍历自定义模型的所有属性。

二、实现:由于我们不想在每个自定义模型里都实现一遍 - (NSString *)description- (NSString *)debugDescription 方法,所以我们可以写到NSObject分类里,一劳永逸。

#import "NSObject+MZExtension.h"

//Libs
#import 

@implementation NSObject (MZDescription)

- (NSString *)debugDescription {
    return [self modelDescription];
}

- (NSString *)description {
    return [self modelDescription];
}

- (NSArray *)propertyNames {
    
    unsigned int propertyCount = 0;
    objc_property_t *properties = class_copyPropertyList([self class], &propertyCount);
    
    NSMutableArray *results = [[NSMutableArray alloc] initWithCapacity:propertyCount];
    for (int i = 0; i < propertyCount; i++) {
        objc_property_t property = properties[i];
        const char *cName = property_getName(property);
        [results addObject:[NSString stringWithCString:cName encoding:NSUTF8StringEncoding]];
    }
    free(properties);
    
    return [NSArray arrayWithArray:results];
}

- (NSString *)modelDescription {
    
    NSDictionary *keyAndValues = [self dictionaryWithValuesForKeys:self.propertyNames];
    NSMutableDictionary *jsonObject = [[NSMutableDictionary alloc] initWithDictionary:keyAndValues];
    for (NSString *key in keyAndValues) {
        id value = keyAndValues[key];
        if (![value isKindOfClass:[NSString class]] &&
            ![value isKindOfClass:[NSNumber class]] &&
            ![value isKindOfClass:[NSNull class]]) {
            NSString *valueDescription = [value description];
            [jsonObject setValue:valueDescription forKey:key];
        }
    }
    
    NSData *jsonData = [NSJSONSerialization dataWithJSONObject:jsonObject options:NSJSONWritingPrettyPrinted error:nil];
    NSString *jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
    return [NSString stringWithFormat:@"<%@: %p, %@>", NSStringFromClass([self class]), self, jsonString];
}

@end

你可能感兴趣的:(OC:断点调试打印自定义模型(展示model属性))