zoukankan      html  css  js  c++  java
  • 【iOS】desctiption和debugDescription

    一、简介

      与.NET一样,在.NET上得Object对象有个ToString()方法可以用于输出对象的信息,在iOS上的NSObject也有一个方法,为description,该方法返回objc对象的描述信息,当我们调用NSLog打印一个对象或者NSString格式化输出一个对象的时候,就会调用该方法,NSObject还有另一个方法debugDescription,用于在调试控制台输出信息(在控制台输出对象信息如:po person),默认情况下debugDescription调用的时description方法

    二、演示

    @interface Person : NSObject
    
    @property (nonatomic, assign) NSUInteger age;
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSUInteger gender;
    @property (nonatomic, assign) float weight;
    
    @end
    
    
    @implementation Person
    @end
    Person 
    Person *person = [[Person alloc] init];
    person.name =@"bomo";
    person.age =  24;
    person.weight = 134;
            
    NSString *logMessage = [NSString stringWithFormat:@"%@", person];
        
    NSLog(@"stringWithFormat: %@", logMessage);
    NSLog(@"nslog: %@", person);

    默认情况下,object-c对象只输出对象名字和对象的地址,默认的实现应该是这样的

    - (NSString *)description
    {
        return [NSString stringWithFormat:@"<%@: %p>", NSStringFromClass([self class]), self];
    }

    一般这两个信息对于我们调试没太大帮助,通常我们希望看到类的更多属性的信息,我们可以重写description方法

    @interface Person : NSObject
    
    @property (nonatomic, assign) NSUInteger age;
    @property (nonatomic, copy) NSString *name;
    @property (nonatomic, assign) NSUInteger gender;
    @property (nonatomic, assign) float weight;
    
    @end
    
    
    @implementation Person
    
    - (NSString *)description
    {
        return [NSString stringWithFormat:@"<Person: %p> {
    	name=%@,
    	age=%ld,
    	weight=%f,
    	gender=%lu
    }", self, self.name, self.age, self.weight, self.gender];
    }
    
    @end

    输出下面信息

    三、抽象基类

      从上面看到,如果我们要为每个model都重写description方法,那就太费劲了,程序员都是很懒的,其实我们可以封装一个通用的方法,通过运行时的API动态获取到对象的类型,并输出,该方法可以给所有的类通用

    这里创建一个基类BaseModel,我们在基类实现一个通用的description方法(除了基类的方式,我们也可以重写NSObject的description方法,应为基本上所有的类都集成自NSObject,我们不能拿到NSObject的源代码,objc提供了一种叫method swizzling技术,可以在运行时替换两个方法的实现,我们可以吧NSObject的description换成我们的实现,详情参见:http://www.cnblogs.com/bomo/p/4693363.html

    @interface BaseModel : NSObject
    @end
    
    @implementation BaseModel
    
    - (NSString *)description1
    {
        id modelClass = [self class];
        unsigned int outCount, i;
        objc_property_t *properties = class_copyPropertyList(modelClass, &outCount);
        
        NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithCapacity:outCount];
        
        //遍历出所有的属性key/value
        for (i = 0; i < outCount; i++) {
            objc_property_t property = properties[i];
            NSString *propName = [NSString stringWithUTF8String:property_getName(property)];
            id value = [[self valueForKey:propName] description];
            [dict setObject:value forKey:propName];
        }
        return [NSString stringWithFormat:@"<%@: %p> %@", NSStringFromClass([self class]), self, dict];
    }
    
    - (NSString *)debugDescription
    {
        return [self description];
    }
    
    @end

    这是我们的Person类只需要继承自BaseModel即可实现如NSDictionary的输出,这里是利用的字典的输出,就不用自己拼字符串

    我们也可以只重写debugDescription方法,在调试控制台输出的时候才输出类的所有属性信息,而description保留默认的实现

  • 相关阅读:
    那些离不开的 Chrome 扩展插件
    Spring Boot 实战 —— 入门
    Maven 学习笔记
    Linux lvm 分区知识笔记
    Linux 双向 SSH 免密登录
    CentOS Yum 源搭建
    Ubuntu 系统学习
    iOS 测试三方 KIF 的那些事
    Swift 网络请求数据与解析
    iOS Plist 文件的 增 删 改
  • 原文地址:https://www.cnblogs.com/bomo/p/4811906.html
Copyright © 2011-2022 走看看