美文网首页
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