美文网首页
iOS 让控制台以字典形式打印出model的所有属性

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

作者: 东了个尼 | 来源:发表于2017-08-11 15:28 被阅读0次
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地址

相关文章

网友评论

      本文标题:iOS 让控制台以字典形式打印出model的所有属性

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